python 3.1-创建正态分布

python 3.1-创建正态分布,python,Python,我有scipy和numpy,pythonv3.1 我需要创建一个长度为300万的1D数组,使用100-60000之间(包括)的随机数。它必须符合正态分布 使用“a=numpy.random.standard_normal(3000000)”,我得到了所需长度的正态分布;不确定如何达到所需的范围。试试这个不错的小方法: 您需要一个只生成一个随机数的方法 import random list = [random.randint(min,max) for i in range(numitems)]

我有scipy和numpy,pythonv3.1

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


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

试试这个不错的小方法:

您需要一个只生成一个随机数的方法

import random
list = [random.randint(min,max) for i in range(numitems)]
这将为您提供一个列表,其中包含最小值和最大值之间的numitems随机数


当然,3000000是很多需要记忆的项目。考虑程序所需的随机数。

< P>标准正态分布平均值为0,标准偏差为1。我从你们的要求中了解到,你们需要一个((60000-100)/2,(60000-100)/2)个。从
standard\u normal()
result中获取每个值

我没有使用过NumPy,但快速搜索文档表明,您可以直接使用NumPy实现您想要的功能


最后一点:正态分布不是有界的。这意味着不存在概率为零的值。你的要求应该是均值和方差(或标准差),而不是极限。

如果你想要一个真正的随机正态分布,你不能保证数字会传播多远。但是,您可以通过指定标准偏差来降低异常值的概率

>>> 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

当然,您仍然可以随机选择超出范围的值。randrange不会创建正态分布。此外,OP要求的是一个NumPy数组,而不是列表。哎呀,我不知道这个存在,+1,使用这个方法,而不是我的。谢谢!我花了一段时间才清醒过来,但我到了那里。理解一些基本的统计数据同样是一个编程问题。干杯。然而,我们通常会以范围的形式找到值,只想在其中放入正态分布。不一定是任何东西的要求。那么你如何计算出新的方差和新的均值呢?平均值应该是我们想要的最大值,但是方差呢?@Zelphir样本的平均值和方差是。不过,样本(或总体)的分布可能并不正常。例如,样本
[2]*100
(一个包含100个
2
的列表)具有均值
2
、方差
0
和均匀分布。瞧,分布是样本的一个特征,没有人能“放”在那里。@Apalala我的措辞当然只是口语。我认为问题在于,无论是numpy还是普通Python都不能提供这样一个截断正态分布,因为从数学上讲,它不再是正态分布了。我想如果没有任何值大于或小于max和min真的很重要,那么必须自己编写函数。如果需要整数,请检查边缘情况:由于舍入,可能会有50%的命中率被截断!只需生成10000个数字并计算每个数字的出现次数:它们应该或多或少相等。下面是一个用
uniform
分布在0..100中克服边缘情况的例子:
round(random.uniform(-0.5100+0.5))
我在上面使用过,但是注释确实有助于理解。谢谢