生成0到1之间具有高斯分布的随机数

本文关键字:高斯分布 随机数 之间 生成 | 更新日期: 2023-09-27 18:08:56

我想在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));

生成0到1之间具有高斯分布的随机数

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

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

总结一下,你想要的算法是:
  1. 求出所需的概率分布函数,使曲线某一部分下的面积等于在该范围内随机产生值的概率。
  2. 对概率分布进行积分,确定累计分布
  3. 反转累积分布得到分位数函数
  4. 通过分位数函数对均匀分布的超过(0,1)随机数据进行变换。

当然,如果你已经知道你想要的分布的分位数函数,那么你就不需要做第一步到第三步。

你说你想要一个生成0到1之间正态分布(高斯)随机数的生成器。

首先,正态分布是无界的…示例中显示的函数生成均值为0.0,标准差为1.0的正态分布随机数

您可以生成任何平均值和标准差的正态分布随机值,方法是将从该函数得到的值乘以期望的标准偏差,然后加上期望的平均值…

代码是OK的-问题是对高斯(正态)分布的误解,其范围为-inf到+inf…

大约2/3的时间,您得到的值将在+/- 1个标准差之间....大约95%的情况下,该值将在标准偏差的+/1 - 3倍之间…