gpt4 book ai didi

c# - 如何从整数范围内生成正态分布的随机数?

转载 作者:可可西里 更新时间:2023-11-01 09:11:25 24 4
gpt4 key购买 nike

给定整数范围的开始和结束,我如何计算该范围之间的正态分布随机整数?

我意识到正态分布趋于 -+ 无穷大。我想尾部可以被切断,所以当随机计算超出范围时,重新计算。这提高了范围内整数的概率,但只要这种影响是可以容忍的 (<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;
}

最佳答案

如果 Box-Muller 方法返回“标准”正态分布,则均值为 0,标准差为 1。要转换标准正态分布,请将随机数乘以 X 以获得标准差 X,然后添加Y 获取平均值 Y,如果我没记错的话。

参见 Wikipedia article's section on normalizing standard normal variables (property 1)以获得更正式的证明。


根据经验,正态分布的 99.7% 将在标准差的 +/- 3 倍范围内。例如,如果您需要从 0 到 100 的正态分布,那么您的平均值将为一半,并且您的 SD 将为 (100/2)/3 = 16.667。因此,无论您从 Box-Muller 算法中得到什么值,乘以 16.667 以“拉伸(stretch)”分布,然后加 50 以“居中”它。


John,针对您的最新评论,我真的不确定 Next 函数的意义何在。它始终使用 1 的标准差和最小值与最大值之间的平均值。

如果您想要 Y 的平均值,其中约 99.7% 的数字在 -X 到 +X 范围内,那么您只需调用 BoxMuller(Y, X/3)

关于c# - 如何从整数范围内生成正态分布的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1303368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com