Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中具有给定间隔和平均值的随机数生成器,而不是C#_Python_Random - Fatal编程技术网

Python中具有给定间隔和平均值的随机数生成器,而不是C#

Python中具有给定间隔和平均值的随机数生成器,而不是C#,python,random,Python,Random,我正在使用python2.7.12和anaconda4.2.0(64位)。尝试使用随机包生成随机数。我需要在间隔内生成n个数,它们的平均值应该是指定值。例如: 我希望14随机生成的数字介于42000和91000之间,我希望这些数字的平均值为60000 我知道如何使用random生成整数: random.randint(4200091000) 我可以把它放在一个for循环中,但是,我怎样才能将它们的平均值调整为60000?有很多方法可以在两个值和一个特定的平均值之间生成随机数。Python为其中一

我正在使用
python2.7.12
anaconda4.2.0(64位)
。尝试使用随机包生成随机数。我需要在
间隔内生成
n
个数
,它们的平均值应该是
指定值
。例如:

我希望
14
随机生成的数字介于
42000
91000
之间,我希望这些数字的平均值为
60000

我知道如何使用random生成整数:

random.randint(4200091000)


我可以把它放在一个for循环中,但是,我怎样才能将它们的平均值调整为
60000

有很多方法可以在两个值和一个特定的平均值之间生成随机数。Python为其中一些方法内置了方法,但当我说有很多方法时,我是认真的

最简单的方法是使用三角形分布<代码>随机。三角形(低、高、模式)将根据低和高之间的分布,以指定模式生成一个数字。这可能足够好了,但如果您真的想要一个平均值,您可以使用以下函数:

def triangular_mean(low, high, mean):
    mode = 3 * mean - low - high
    return random.triangular(low, high, mode)
def beta_mean(low, high, mean, alpha):
    offset = low
    scale = high - low
    true_mean = (mean - offset)/scale
    beta = (alpha/true_mean) - alpha
    return offset + scale * random.beta(alpha, beta)
如果您想变得更复杂,可以通过调用
random.beta(alpha,beta)
使用beta发行版。这些都是非常灵活和非常奇怪的;这张来自维基百科的图片凸显了它们有多奇怪

beta分布的平均值是
alpha/(alpha+beta)
,结果总是介于0和1之间,因此为了将其扩展到您的用例,让我们将其总结到以下函数中:

def triangular_mean(low, high, mean):
    mode = 3 * mean - low - high
    return random.triangular(low, high, mode)
def beta_mean(low, high, mean, alpha):
    offset = low
    scale = high - low
    true_mean = (mean - offset)/scale
    beta = (alpha/true_mean) - alpha
    return offset + scale * random.beta(alpha, beta)
在上述函数中,alpha将在不改变平均值的情况下改变分布的形状;它将改变分布的中位数、模式、方差和其他属性

还有其他的发行版可以用函数包装以适合您的用例,但是我想上面两个版本将适合您想要的任何用例


这些函数还将生成浮点数,因此如果需要整数,则必须将它们转换为整数,方法可以是编辑函数或在调用函数后显式转换它们。

有很多方法可以在两个值和特定平均值之间生成随机数。Python为其中一些方法内置了方法,但当我说有很多方法时,我是认真的

while True:  # until a good sample was found
  s = [ random.randint(42000, 91000) for _ in range(13) ]
  v = 60000 + (60000 - (sum(s) / len(s))) * 13
  if 42000 <= v <= 91000:
    s.append(v)
    break
print sum(s) / len(s)  # will print 60000
最简单的方法是使用三角形分布<代码>随机。三角形(低、高、模式)将根据低和高之间的分布,以指定模式生成一个数字。这可能足够好了,但如果您真的想要一个平均值,您可以使用以下函数:

def triangular_mean(low, high, mean):
    mode = 3 * mean - low - high
    return random.triangular(low, high, mode)
def beta_mean(low, high, mean, alpha):
    offset = low
    scale = high - low
    true_mean = (mean - offset)/scale
    beta = (alpha/true_mean) - alpha
    return offset + scale * random.beta(alpha, beta)
如果您想变得更复杂,可以通过调用
random.beta(alpha,beta)
使用beta发行版。这些都是非常灵活和非常奇怪的;这张来自维基百科的图片凸显了它们有多奇怪

beta分布的平均值是
alpha/(alpha+beta)
,结果总是介于0和1之间,因此为了将其扩展到您的用例,让我们将其总结到以下函数中:

def triangular_mean(low, high, mean):
    mode = 3 * mean - low - high
    return random.triangular(low, high, mode)
def beta_mean(low, high, mean, alpha):
    offset = low
    scale = high - low
    true_mean = (mean - offset)/scale
    beta = (alpha/true_mean) - alpha
    return offset + scale * random.beta(alpha, beta)
在上述函数中,alpha将在不改变平均值的情况下改变分布的形状;它将改变分布的中位数、模式、方差和其他属性

还有其他的发行版可以用函数包装以适合您的用例,但是我想上面两个版本将适合您想要的任何用例

这些函数还将生成浮点数,因此如果需要整数,则必须将它们转换为整数,方法是编辑函数或在调用函数后显式转换它们。

while True:#直到找到好的示例
while True:  # until a good sample was found
  s = [ random.randint(42000, 91000) for _ in range(13) ]
  v = 60000 + (60000 - (sum(s) / len(s))) * 13
  if 42000 <= v <= 91000:
    s.append(v)
    break
print sum(s) / len(s)  # will print 60000
s=[范围(13)内的随机随机随机数(4200091000)] v=60000+(60000-(总和/长度))*13 如果42000
为真:#直到找到一个好的样本
s=[范围(13)内的随机随机随机数(4200091000)]
v=60000+(60000-(总和/长度))*13

如果为42000,应如何分配?高斯分布?可能是完全随机生成它们的重复,计算它们的平均值,最后稍微移动它们以获得所需的结果如何?@JacobG python!=c#想要一组具有特定属性的随机数(“它们的平均值应为60”)的问题在于这两个方面相互矛盾。您可以有一个随机数生成器,它将围绕给定的平均值生成随机数。如果你拿其中的14个,那么这一组将有不同的平均值。它们将如何分配?高斯分布?可能是完全随机生成它们的重复,计算它们的平均值,最后稍微移动它们以获得所需的结果如何?@JacobG python!=c#想要一组具有特定属性的随机数(“它们的平均值应为60”)的问题在于这两个方面相互矛盾。您可以有一个随机数生成器,它将围绕给定的平均值生成随机数。如果你取其中14个,那么这个集合将有一个不同的平均值。我相信OP感兴趣的是修正样本平均值,而不是总体平均值。也许,我无法得到这个函数。但是,当我运行它一次的时候,我想它应该会产生60000,因为我们预期它应该是60000。然而,它产生了50585.37639745854,一些随机数,实际上并不接近60000。我相信OP对固定样本平均值而不是总体平均值感兴趣。可能我无法得到函数。但是,当我运行它一次的时候,我想它应该会产生60000,因为我们预期它应该是60000。然而,它的结果是50585.37639745854,这是一个不接近60000的随机数。这是一个矛盾问题的最佳答案@用户8028576,您要求使用
a=42000
b=91000
构建离散均匀分布。问题是,从数学上讲,该分布的平均值应该是(a+b)/2=66500,或者