我想生成一些通常分布的随机数。这不是关键任务,所以一个简单的算法就足够了。然后我想提供自己的均值和标准偏差。
从我能够阅读的内容来看,根据中心极限定理,我应该能够通过将随机数加在一起来近似正态分布的随机数。
例如:
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()
来电次数。
答案 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 distribution和Bates 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)
标准偏差定义如下:
您迭代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范围内所有值的可能性相等。