我有scipy和numpy,Python v3.1
我需要创建一个长度为3百万的一维数组,使用100-60,000之间(包括)的随机数。它必须符合正态分布。
使用'a = numpy.random.standard_normal(3000000)',我获得所需长度的正态分布;不确定如何达到要求的范围。
答案 0 :(得分:10)
标准正态分布的平均值为0,标准差为1.我根据您的要求了解您需要((60000-100)/ 2,(60000-100)/ 2)。从standard_normal()
结果multiply it by the new variance, and add the new mean获取每个值。
我没有使用过NumPy,但快速搜索文档说你可以使用numpy.random.normal()
最后一点:正常分布不受限制。这意味着没有概率为零的值。您的要求应该是均值和方差(或标准偏差),而不是限制。
答案 1 :(得分: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
当然,您仍然可以使用超出此范围的值
答案 2 :(得分:-4)
尝试这个不错的小方法:
你需要一个只生成一个随机数的方法。
import random
list = [random.randint(min,max) for i in range(numitems)]
这将为您提供一个列表,其中包含最小和最大之间的numitems随机数。
当然,3000000是很多内存中的物品。考虑制作程序所需的随机数。