任何人都可以告诉我最好的方法是生成一个0到100的(numpy)数组包含值,由一个(例如)正态分布函数加权,平均值为50,方差为5.所以还有更多50秒和更少(几乎没有)零和数百。我认为这个问题不应该太难解决,但我不知所措......
我想到了np.linspace,但似乎没有重量选项。
所以要明确一点:我不是一个从0到100的简单正态分布,而是类似0到100之间的数组,中间的值密度更高。
由于
答案 0 :(得分:3)
您可以使用scipy的统计分布:
import numpy as np
from scipy import stats
# your distribution:
distribution = stats.norm(loc=50, scale=5)
# percentile point, the range for the inverse cumulative distribution function:
bounds_for_range = distribution.cdf([0, 100])
# Linspace for the inverse cdf:
pp = np.linspace(*bounds_for_range, num=1000)
x = distribution.ppf(pp)
# And just to check that it makes sense you can try:
from matplotlib import pyplot as plt
plt.hist(x)
plt.show()
当然,我承认起点和终点并不像这样,因为前后来回的数字不准确。
答案 1 :(得分:1)
重要的是要理解,您的问题不是完全可解决的,因为通常有限的离散样本不能完全重现您的分布。
您可以轻松地看到这一点,当您将问题的平凡版本称为[0,1]中具有相同分布的一组3个值时。这里结果[0,0,1]和[0,1,1]都是合理的。
但是,你可以解决问题粗略。如果您要求count
元素中包含[0,1,...,N]
元素的数组,其中给定的概率为p=[p0,p1,...,pN]
并且已标准化(p0+...+pN==1
),则元素的计数c_k
结果数组中的k
理论上是
c[k] = p[k]*count
但现在这些计数都是花车。你必须决定一种方法来“围绕”他们,同时保持他们的总和。这是由于你的问题定义不明确而产生的选择自由。
答案 2 :(得分:0)
>>> sorted([int(random.gauss(50,5)) for i in range(100)])
[33, 40, 40, 40, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 61]