给定整数范围的开始和结束,如何计算这个范围之间的正态分布随机整数?
我意识到正态分布是无限的.我猜尾巴可以被截断,所以当一个随机值计算在范围之外时,重新计算.这提高了整数在该范围内的概率,但是只要该效果是可以忍受的(<5%),这是很好的.
public class Gaussian
{
private static bool uselast = true;
private static double next_gaussian = 0.0;
private static Random random = new Random();
public static double BoxMuller()
{
if (uselast)
{
uselast = false;
return next_gaussian;
}
else
{
double v1,v2,s;
do
{
v1 = 2.0 * random.NextDouble() - 1.0;
v2 = 2.0 * random.NextDouble() - 1.0;
s = v1 * v1 + v2 * v2;
} while (s >= 1.0 || s == 0);
s = System.Math.Sqrt((-2.0 * System.Math.Log(s)) / s);
next_gaussian = v2 * s;
uselast = true;
return v1 * s;
}
}
public static double BoxMuller(double mean,double standard_deviation)
{
return mean + BoxMuller() * standard_deviation;
}
public static int Next(int min,int max)
{
return (int)BoxMuller(min + (max - min) / 2.0,1.0);
}
}
我可能需要将标准差缩小到一定程度上,但不了解如何.
回答:
// Will approximitely give a random gaussian integer between min and max so that min and max are at
// 3.5 deviations from the mean (half-way of min and max).
public static int Next(int min,int max)
{
double deviations = 3.5;
int r;
while ((r = (int)BoxMuller(min + (max - min) / 2.0,(max - min) / 2.0 / deviations)) > max || r < min)
{
}
return r;
}