如何在python中具有特定平均值的范围内生成随机数?

时间:2013-12-26 20:38:10

标签: python math random

所以我想说我想在-1000到1000之间生成一个随机数,我希望平均值为x。我该怎么做?

编辑:为了清楚起见,生成的数字应该落在标准的正态分布中,平均值为x。

因此,如果我生成了一千个数字并找到了它们的平均数,那就是x。

我试过了,但它似乎不起作用:

sum_ = 0
for i in range(0, 10):
  sum_ += random.triangular(-1000, 1000, 10)
print sum_ / 10

我希望这能给我一些东西~10但我显然没有使用正确的代码。

3 个答案:

答案 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是标准偏差。如果你想线性缩放,你可以添加和乘以适当的值。