python 3.1 - 创建正态分布

时间:2011-01-15 03:39:46

标签: python

我有scipy和numpy,Python v3.1

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

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

3 个答案:

答案 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是很多内存中的物品。考虑制作程序所需的随机数。