基于正态分布的范围内的随机数

Con*_*ain 34 random normal-distribution gaussian

我想生成一个范围(n到m,例如100到150)的随机数,但是我希望结果不是纯随机的,而是基于正态分布.

我的意思是,通常我希望数字"聚集"在125左右.

我发现这个随机数字包似乎有很多我需要的东西:http://codeproject.com/KB/recipes/Random.aspx

它支持各种随机生成器(包括mersiene twister),并可以将生成器应用于分发.

但我很困惑,如果我使用正态分布生成器,随机数从大约-6到+8(显然真正的范围是float.min到float.max).

如何扩展到我要求的范围?

tza*_*man 26

标准正态分布的平均值为0,标准差为1; 如果你想用均值m和偏差进行分布s,只需乘以s然后再加上m.由于正态分布在理论上是无限的,你不能在你的范围内有一个硬帽,例如(100到150)而没有明确拒绝掉在它之外的数字,但是如果有适当的偏差选择,你可以确保(例如) 99%的数字都在这个范围内.

大约99.7%的人口在+/- 3标准偏差范围内,所以如果你选择你的人口(25/3),它应该运作良好.

所以你想要这样的东西: (normal * 8.333) + 125


Wil*_*den 14

为了感兴趣,从统一的RNG生成正态分布的随机数非常简单(尽管它必须成对完成):

Random rng = new Random();
double r = Math.Sqrt(-2 * Math.Log(rng.NextDouble()));
double ? = 2 * Math.Pi * rng.NextDouble();
double x = r * Math.Cos(?);
double y = r * Math.Sin(?);
Run Code Online (Sandbox Code Playgroud)

xy现在包含两个独立的,正态分布的均值为0,方差为1您可以缩放和平移它们是必须得到你想要的范围内(如interjay解释)的随机数.


说明:

这种方法称为Box-Muller变换.它使用二维单位Gaussian的性质,密度值本身,p = exp(-r^2/2)均匀分布在0和之间1(为简单起见,去除了归一化常数).

由于您可以使用统一的RNG轻松生成此类值,因此最终得到圆形的半径轮廓r = sqrt(-2 * log(p)).然后,您可以在两者之间生成第二个均匀随机变量,02*pi为您提供一个角度?,用于定义圆形轮廓上的唯一点.最后,您可以通过从极坐标转换回笛卡尔坐标来生成两个iid正态随机变量.(r, ?)(x, y)

这个属性 - p均匀分布 - 不适用于其他维度,这就是为什么你必须一次只生成两个正常变量.