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));
4

2 回答 2

4

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

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

总结一下,你想要的算法是:

  1. 计算出所需的概率分布函数,使得曲线部分下方的面积等于在该范围内随机生成一个值的概率。
  2. 整合概率分布以确定累积分布
  3. 反转累积分布以获得分位数函数
  4. 通过 quantile 函数运行它来转换您的均匀分布在 (0,1) 上的随机数据。

当然,如果您已经知道所需分布的分位数函数,那么您不需要执行步骤 1 到 3。

于 2013-04-12T15:06:36.307 回答
2

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

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

您可以生成任何平均值和标准偏差的正态分布随机值,方法是将从此函数获得的值乘以所需的标准偏差,然后加上所需的平均值......

代码按原样正常 - 问题是对高斯(正态)分布的误解,其范围为 -inf 到 +inf ...

大约 2/3 的时间你得到的值将在 +/- 1 标准偏差之间......大约 95% 的时间值将在 +/1 3 倍标准偏差之间......

于 2014-11-15T17:05:25.177 回答