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

在python中,如何生成具有特定平均值的范围内的随机数?,python,math,random,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 我希望这能给我一些东西,但我显然没有使用正确的代码 normalvaria

假设我想生成一个介于-1000和1000之间的随机数,平均值是x。我该怎么做

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

因此,如果我生成一千个数字,并找到它们的平均值,它将是x

我试过这个,但似乎不起作用:

sum_ = 0
for i in range(0, 10):
  sum_ += random.triangular(-1000, 1000, 10)
print sum_ / 10
我希望这能给我一些东西,但我显然没有使用正确的代码

    normalvariate(self, mu, sigma) method of Random instance
    Normal distribution.

    mu is the mean, and sigma is the standard deviation.
i、 e

这里2是平均值,17是标准偏差。如果要线性缩放,可以将适当的值相加或相乘

i、 e


这里2是平均值,17是标准偏差。如果你想线性缩放,你可以加上适当的值,然后乘上相应的值。

标准正态分布的范围是无限的,在任何给定的区间之外都有找到点的非零概率。你可以使用,只要记住平均值是
(a+b+模式)/3
,所以
三角形(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

标准正态分布的范围是无限的,在任何给定的区间外都有找到点的非零概率。你可以使用,只要记住平均值是
(a+b+模式)/3
,所以
三角形(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

正如一些评论所提到的,这两个要求相互冲突:

我想生成一个介于-1000和1000之间的随机数

生成的数字应符合标准正态分布,平均值为x

因为标准有一个无限域。如果您从正态分布中选择数字,则可能会得到大于1000或小于-1000的值。相反,如果将范围限制为[-10001000],则不会从正态分布绘制

一种选择是根据截断正态分布生成数字,这与标准正态分布类似,只是概率在范围[-10001000]之外设置为零。最简单的方法是根据正态分布选择一个数字,如果它超出了所需的范围,只需再次选择

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
使用概率从-1000线性增加到
模式
,然后从
模式
线性减少到1000的分布。不过,这个问题的关键在于,
模式
是被选择概率最大的值。这与所选数字的平均值不同。实际平均值是
(最小值+最大值+模式)/3。
,或者在您的情况下,因为
最小值+最大值=1000-1000=0
,所以只有
模式/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)
def生成_数(平均值):
模式=3*平均值
如果模式<-1000或模式>1000:
raise VALUERROR('无法满足平均值:%f'%Average]
返回随机。正常变量(-1000,1000,模式)

请注意,使用此分布意味着您永远无法生成平均值小于
-1000./3.
或大于
1000./3.
的数字,除非您也相应地调整最小值或最大值。

如几条注释所述,这两个要求相互冲突:

我想生成一个介于-1000和1000之间的随机数

生成的数字应符合标准正态分布,平均值为x

因为标准有一个无限域。如果您从正态分布中选择数字,则可能会得到大于1000或小于-1000的值。相反,如果将范围限制为[-10001000],则不会从正态分布绘制

一种选择是根据截断正态分布生成数字,这与标准正态分布类似,只是概率在范围[-10001000]之外设置为零。最简单的方法是根据正态分布选择一个数字,如果它超出了所需的范围,只需再次选择

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
使用概率从-1000线性增加到
模式
,然后从
模式
线性减少到1000的分布。不过,这个问题的关键在于,
模式
是被选择概率最大的值。这与所选数字的平均值不同。实际平均值是
(最小值+最大值+模式)/3。
,或者在您的情况下,因为
最小值+最大值=1000-1000=0
,所以只有
模式/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)
def生成_数(平均值):
模式=3*平均值
如果模式<-1000或模式>1000:
raise VALUERROR('无法满足平均值:%f'%Average]
返回随机。正常变量(-1000,1000,模式)

请注意,使用此分布意味着您永远无法生成平均值小于
-1000./3.
或大于
1000./3.
,除非您也相应地调整最小值或最大值。

随机int或随机float?您尝试过什么吗?我不熟悉编码,我尝试过random.triangal,但这似乎不是我想要的。在这一点上,float或int并不重要。您必须在帖子中包含您尝试过的代码,并指出您的问题所在。由于您是新用户,请阅读StackOverflow常见问题解答。您似乎在使用术语时不知道它们的含义。正态分布的范围总是无限的,标准正态分布是均值为零,标准差为一的正态分布。所以,用你的标准来构造“一个”标准正态分布是不可能的