Python 3.1 - 创建正态分布
我安装了scipy和numpy,使用的是Python 3.1。
我需要创建一个长度为300万的一维数组,里面的随机数要在100到60000之间(包括100和60000)。而且这些随机数要符合正态分布。
我用 'a = numpy.random.standard_normal(3000000)' 生成了一个长度为300万的正态分布数组,但我不太知道怎么把这些数限制在我需要的范围内。
3 个回答
-4
试试这个简单的方法:
你需要一个方法来生成一个随机数。
import random
list = [random.randint(min,max) for i in range(numitems)]
这样你就能得到一个包含 numitems 个在最小值和最大值之间的随机数的列表。
当然,3000000 这个数字在内存中占用的空间很大。可以考虑在程序需要的时候再生成这些随机数。
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
所以,在这种情况下,确保标准差只有范围一半的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
当然,你仍然可能会得到一些超出范围的值。
10
标准正态分布的平均值是0,标准差是1。根据你的需求,我理解你需要的是一个平均值为((60000-100)/2, (60000-100)/2)的分布。你可以从standard_normal()
的结果中取每个值,然后用新的方差去乘这个值,再加上新的平均值。
我没有用过NumPy,但我快速查了一下文档,发现你可以直接使用numpy.random.normal()
来实现你想要的效果。
最后补充一点:正态分布是没有边界的。这意味着没有一个值的概率是零。你的需求应该是以平均值和方差(或标准差)来描述,而不是以限制来描述。