在python中,如何生成具有特定平均值的范围内的随机数?
假设我想生成一个介于-1000和1000之间的随机数,平均值是x。我该怎么做 编辑:为了清楚起见,生成的数字应该属于标准正态分布,平均值为x 因此,如果我生成一千个数字,并找到它们的平均值,它将是x 我试过这个,但似乎不起作用:在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
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常见问题解答。您似乎在使用术语时不知道它们的含义。正态分布的范围总是无限的,标准正态分布是均值为零,标准差为一的正态分布。所以,用你的标准来构造“一个”标准正态分布是不可能的