python 3.1 - 创建正态分布

jim*_*imy 7 python

我有scipy和numpy,Python v3.1

我需要创建一个长度为3百万的一维数组,使用100到60,000之间的随机数.它必须符合正态分布.

使用'a = numpy.random.standard_normal(3000000)',我获得了所需长度的正态分布; 不确定如何达到要求的范围.

Apa*_*ala 10

标准正态分布的平均值为0,标准差为1.我从您的要求中了解到您需要((60000-100)/ 2,(60000-100)/ 2).从standard_normal()结果中获取每个值,将其乘以新方差,然后添加新均值.

我没有使用NumPy,但快速搜索文档说你可以实现你想要的直接使用 numpy.random.normal()

最后一点:正态分布不受限制.这意味着没有概率为零的值.您的要求应该是均值和方差(或标准偏差),而不是限制.


fma*_*ark 6

如果你想要一个真正随机的正态分布,你就无法保证数字的传播距离.但是,您可以通过指定标准偏差来降低异常值的概率

>>> n = 3000000
>>> sigma5 = 1.0 / 1744278
>>> n * sigma5
1.7199093263803131  # Expect one values in 3 mil outside range at 5 stdev.
>>> sigma6 = 1.0 / 1 / 506800000
>>> sigma6 = 1.0 / 506800000
>>> n * sigma6
0.0059194948697711127 # Expect 0.005 values in 3 mil outside range at 6 stdev.
>>> sigma7 = 1.0 / 390600000000
>>> n * sigma7
7.6804915514592934e-06
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,确保标准偏差仅为范围一半的1/6或1/7将使您确信您的数据不会超出范围.

>>> range = 60000 - 100
>>> spread = (range / 2) / 6 # Anything outside of the range will be six std. dev. from the mean
>>> mean = (60000 + 100) / 2
>>> a = numpy.random.normal(loc = mean, scale = spread, size = n) 
>>> min(a)
6320.0238199673404
>>> max(a)
55044.015566089176
Run Code Online (Sandbox Code Playgroud)

当然,您仍然可以在此范围之外的值