cirnogodot/Scripts/Utils/RandomStuff.cs

40 lines
1.1 KiB
C#
Raw Normal View History

2025-05-01 11:59:32 +02:00
using System;
using Godot;
namespace Cirno.Scripts.Utils;
public static class RandomStuff
{
public static double GaussianRandom(double mean = 0.0, double stdDev = 1.0)
{
// Box-Muller transform
float u1 = GD.Randf();
float u2 = GD.Randf();
// Ensure u1 is strictly > 0
while (u1 <= 0f)
u1 = GD.Randf();
float randStdNormal = Mathf.Sqrt(-2f * Mathf.Log(u1)) * Mathf.Sin(2f * Mathf.Pi * u2);
return mean + stdDev * randStdNormal;
}
public static float GaussianClamped(float mean, float stdDev, float min, float max)
{
float value;
do
{
float u1 = GD.Randf();
float u2 = GD.Randf();
// Ensure u1 > 0 to avoid log(0)
while (u1 <= 0f) u1 = GD.Randf();
float randStdNormal = Mathf.Sqrt(-2f * Mathf.Log(u1)) * Mathf.Sin(2f * Mathf.Pi * u2);
value = mean + stdDev * randStdNormal;
}
while (value < min || value > max); // reject out-of-bounds values
return value;
}
}