生成介于0和1之间、服从高斯分布的随机数

7

我想在C#中编写一个方法,以高斯分布的形式在范围[0:1](并且预先在[0-x]范围内)生成随机数。 我找到了这段代码,但它不能正常工作。

Random rand = new Random(); //reuse this if you are generating many
double u1 = rand.NextDouble(); //these are uniform(0,1) random doubles
double u2 = rand.NextDouble();
double randStdNormal = Math.Abs( Math.Sqrt(-2.0 * Math.Log(u1)) * 
                                 Math.Sin(2.0 * Math.PI * u2));

7
可能是重复问题? https://dev59.com/YHM_5IYBdhLWcg3wn0hO - Roger Rowland
@RogerRowland,不是那样的情况,我想编写一个简单的方法而不是类。我发现了这个方法,但是有时它会给我返回负值并且结果不准确。 - Yuseferi
6
“简单方法”和类的区别在于封装。这个回答包含了你需要的信息,特别是那个方法。你可以按照自己的方式进行封装。 - Jim Mischel
@JimMischel 我不理解,能否请您用简短的语句写出来,谢谢。 - Yuseferi
2个回答

4

我写了一篇关于如何生成任意分布随机数的博客文章:

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

总之,您想要的算法是:
  1. 计算所需的概率分布函数,使曲线下某一部分的面积等于在该范围内随机生成的值的概率。
  2. 对概率分布进行积分,确定累积分布
  3. 反转累积分布以获得分位数函数
  4. 通过运行数据通过分位数函数来转换在(0,1)上均匀分布的随机数据。
当然,如果您已经知道所需分布的分位数函数,则不需要执行第一到第三步。

2
你说你需要一个生成0到1之间正态分布(高斯分布)随机数的生成器。
首先,正态分布没有边界...你在示例中展示的函数生成具有0.0均值和1.0标准差的正态分布随机数。
你可以通过将从此函数得到的值乘以所需的标准差,然后加上所需的平均值来生成任何平均值和标准差的正态分布随机值...
代码是正确的 - 问题在于对高斯(正态)分布的误解,其范围为-inf到+inf...
大约2/3的时间,您得到的值将在+/- 1个标准偏差之间...大约95%的时间,该值将在+/1 3倍标准偏差之间...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接