通过添加随机数来近似正态分布

时间:2017-09-26 04:56:57

标签: random probability normal-distribution

我想生成一些通常分布的随机数。这不是关键任务,所以一个简单的算法就足够了。然后我想提供自己的均值和标准偏差。

从我能够阅读的内容来看,根据中心极限定理,我应该能够通过将随机数加在一起来近似正态分布的随机数。

例如:

rand()+rand()+rand()+rand()+rand()+rand()

其中rand()导致从0到1的均匀分布的随机数 是一个合理的近似值。 (我知道技术上是0 ≤ rand() < 1)。

预期的平均值是6*0.5所以我得到了所需的平均值:

(rand()+rand()+rand()+rand()+rand()+rand()-3) + mean

但标准偏差是什么?

一旦我知道,设置任意标准偏差只是一个乘法的问题?

更新

实验上,我发现了

(rand()+rand()+rand()+rand()+rand()+rand()-3)*sqrt(2)*sd+mean

给我一​​组具有所需标准偏差和平均值的数据。我已经使用stddev()avg()聚合函数在具有1000万行的数据库(PostgreSQL)中对此进行了测试,典型结果接近2位小数,这并不算太糟糕。

我不知道为什么会涉及sqrt(2) ......

解决方案

好的,感谢下面的Severin Pappadeux,我有一个答案。

我可以通过以下方式生成合理的结果:

(rand() + … + rand() - n/2) / sqrt(n/12) * sd + mean

其中n是我准备发出的rand()来电次数。

4 个答案:

答案 0 :(得分:2)

  

从我能够阅读的内容来看,根据中心极限定理,我应该能够通过将随机数加在一起来近似正态分布的随机数。

这是一种正确的方法。唯一的问题是仔细分析你错过的尾巴。

让我们考虑制作N(0,1) - 高斯分布均值0和std.deviation为1.然后任何其他高斯N(\mu, \sigma)只是缩放并从N(0,1)转移。

因此,G(0,1)的建议算法(N(0,1)的近似值)是

G(0,1) = U(0,1) + U(0,1) + U(0,1) + U(0,1) + U(0,1) + U(0,1)

其中U(0,1)在{0,1)范围内为uniformly distributed random number。让我们来看看平均值。

E(G(0,1)) = 6*E(U(1,0)) = 6*0.5 = 3

这正是你所拥有的。因此,要获得G(0,1)的0均值,我们必须减去3.现在检查G(0,1)的方差,我们必须使其等于1.

V(G(0,1)) = 6*V(U(1,0)) = 6*(1/12) = 1/2

Std.deviation(σ)是方差的平方根,所以为了得到它你必须除以sqrt(1/2)。

所以,最后的表达式是

G(0,1) = (U(0,1) + U(0,1) + U(0,1) + U(0,1) + U(0,1) + U(0,1) - 3)/sqrt(1/2)

它是N(0,1)的合理良好近似值。

  

我不知道为什么涉及sqrt(2)...

除以sqrt(1/2)与乘以sqrt(2)相同 - 现在我希望你知道它来自哪里。

一些简单的推论 - 对于U(0,1)方差乘数的其他n和,将包括项sqrt(n / 12)。

另一个简单的推论 - 因为V(U(0,1))等于1/12,那么求和十二个U(0,1)将不需要任何乘数

G(0,1) = Sum_1^12 U(0,1) - 6

实际上经常在一些旧的抽样食谱书/论文中引用。

您可能还想查看相关的Irwin-Hall distributionBates distribution

更新

我考虑过一些简化方法。假设我们想要求偶数U(0,1),那么n=2m。再次,将G(0,1)作为N(0,1)

的近似值
G(0,1) = (Sum_1^2m U(0,1) - m ) / sqrt(m/6)

让我们把它重写为

G(0,1) = (Sum_1^m U(0,1) - (m - Sum_1^m U(0,1)))/sqrt(m/6) =
       = (Sum_1^m U(0,1) - Sum_1^m(1 - U(0,1)))/sqrt(m/6)

由于事实,1 - U(0,1)U(0,1)具有相同的分布 以对称形式写G(0,1)

G(0,1) = (Sum_1^m U(0,1) - Sum_1^m U(0,1))/sqrt(m/6) =
       = Sum_1^m (U(0,1) - U(0,1)) / sqrt(m/6)

答案 1 :(得分:0)

如果您使用Python,则可以使用[numpy][1]

import numpy
numpy.random.randn()

答案 2 :(得分:0)

对随机数求和可提供最大值为平均值两倍的分布,因此严重限制了方法。似乎无法正确地近似正态分布。

答案 3 :(得分:-1)

标准偏差定义如下:

standard deviation

您迭代N值,表示为xi,并使用平均值(xbar)。一些JavaScript伪代码看起来像:

var values = [...];
for(var i = 0, var mean; i < values.length; i++) {
   mean += values[i];
}
mean /= values.length;
for(var i = 0, var standardDev; i < values.length) {
   standardDev += Math.pow(values[i] - mean, 2);
}
standardDev = Math.sqrt(standardDev / (values.length - 1));

理论上,良好的RNG应该以非常平坦的方式偏离,表明RNG范围内所有值的可能性相等。