【问题标题】:Get random numbers within one standard deviation获取一个标准差内的随机数
【发布时间】:2015-04-23 00:26:12
【问题描述】:

我想生成随机数,比如说 100。现在我使用 numpy 的目的如下:

print numpy.random.normal(loc=200,scale=50,size=100)

但我希望生成的数字与平均值(即 loc)仅相差一个标准差。最好的方法是什么?

我是否应该简单地执行以下操作:

print numpy.random.randint(150, high=250, size=100)

或者还有其他方法吗?

【问题讨论】:

  • 你的意思是“除了平均值之外只产生一个标准差”?你的意思是你希望得到的数字分布的标准差为 1?在这种情况下,numpy.random.normal(loc=mean, scale=1.0, ...).
  • 哦,你想要一个截断的正态分布。 numpy.random 没有,但 scipy.stats 有。 from scipy import stats; stats.truncnorm.rvs(-1.0, 1.0, loc=200.0, scale=50.0, size=100)
  • 可能是这个问题本身就是一个愚蠢的问题,因为正态分布的数据应该包含具有钟形曲线的 0-max 值。
  • -inf+inf

标签: python-2.7 numpy random normal-distribution


【解决方案1】:

选择一个号码

按照@Robert Kern'scomment 中的建议使用 scipy 的truncnorm

from scipy import stats

arr = stats.truncnorm.rvs(-1, 1, loc=200.0, scale=50.0, size=1) 
print(arr[0])     

前两个参数表示范围 [a, b](以标准差衡量),loc 是均值(分布的中心),scale 是标准差(分布的分布程度) )。

在 -1 到 +3 个 STD 范围内的图号

import matplotlib.pyplot as plt
from scipy import stats

# -1 to +3 standard deviations apart
r = stats.truncnorm.rvs(-1, 3, loc=200.0, scale=50.0, size=10**6)

plt.hist(r, bins=100, color='blue')
plt.xlabel("value")
plt.ylabel("frequency")
plt.show()


旁注:randint()normal()以相同的方式选择数字。

numpy.random.randint

从“半开”区间的“离散均匀”分布中返回随机整数。

numpy.random.normal

从正态(高斯)分布中抽取随机样本。

使用randint() 在所选区间内获得任何数字的几率是相同的,这与来自normal distribution 的数字不同(获得更接近峰值的数字的几率更大)。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2019-08-20
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多