所以我想说我想在-1000到1000之间生成一个随机数,我希望平均值为x。我该怎么做?
编辑:为了清楚起见,生成的数字应该落在标准的正态分布中,平均值为x。
因此,如果我生成了一千个数字并找到了它们的平均数,那就是x。
我试过了,但它似乎不起作用:
sum_ = 0
for i in range(0, 10):
sum_ += random.triangular(-1000, 1000, 10)
print sum_ / 10
我希望这能给我一些东西~10但我显然没有使用正确的代码。
答案 0 :(得分:5)
标准正态分布具有无限范围,在任何给定区间之外找到点的非零概率。您可以使用triangular,只需记住平均值为(a + b + mode) / 3
,以便triangular(a, b, 3*x - a - b)
可以获得您想要的内容:
from random import triangular
a = 0
b = 10
x = 3
test = [triangular(a, b, 3*x - a - b) for _ in range(1000)]
sum(test) / 1000.0
# 3.006828109140065
答案 1 :(得分:3)
正如几条评论所提到的,这两个要求相互冲突:
我想生成介于-1000和1000之间的随机数
和
生成的数字应该落在标准正态分布中,平均值为x
因为标准normal distribution具有无限域名。如果您从正态分布中选择数字,则有可能获得大于1000或小于-1000的值。相反,如果您采取任何措施将范围限制为[-1000,1000],那么您将不会从正态分布中进行绘制。
一种选择是根据截断的正态分布生成数字,这类似于标准正态分布,除了在[-1000,1000]范围之外将概率设置为零。最简单的方法是根据正态分布选择一个数字,如果它超出了所需范围,则再次选择。
SIGMA=10.0 # you can pick this value to be pretty much anything
def generate_number(average):
x = random.normal_variate(average, SIGMA)
while x > 1000 or x < -1000:
x = random.normalvariate(average, SIGMA)
return x
这里SIGMA
是正态分布的标准差,它控制着值的展开程度。如果SIGMA
很小并且average
不接近1000或-1000,或者更准确:如果(1000-average)/SIGMA
和(1000+average)/SIGMA
都大于2或3,那么方法将相当有效,因为它通常会在第一次达到期望范围[-1000,1000]内的数字。但是,如果其中一个比例很小,比如大约1或更小,那么算法有时必须循环一次或两次。这可能不会有什么大不了的。 (如果你想避免使用它,你可以使用先进的技术,但我认为它不值得复杂。)
另一个选项,就是问题中的示例代码所做的那样,是完全放弃使用正态分布的要求,并使用一些自然限制在某个范围内的其他概率分布。您的示例代码,相当于
random.triangular(-1000,1000,mode)
使用一种分布,其中概率从-1000线性增加到mode
,然后从mode
线性地减少到1000.但是,这个问题是mode
是选择概率最大的值。它与所选数字的平均值不同。实际平均值为(min+max+mode)/3.
,或者在您的情况下为min+max = 1000-1000 = 0
,仅为mode/3
,因此如果您想生成具有指定平均值的数字,则必须使用
def generate_number(average):
mode = 3*average
if mode < -1000 or mode > 1000:
raise ValueError('Average cannot be satisfied: %f' % average)
return random.normal_variate(-1000, 1000, mode)
请注意,使用此分布意味着您永远不会生成平均值小于-1000./3.
或大于1000./3.
的数字,除非您还相应地调整最小值或最大值。
答案 2 :(得分:2)
normalvariate(self, mu, sigma) method of Random instance
Normal distribution.
mu is the mean, and sigma is the standard deviation.
即
import random
x= random.normalvariate(2,17)
这里2是平均值,17是标准偏差。如果你想线性缩放,你可以添加和乘以适当的值。