Python 基于分布生成一组随机整数列表

Python 基于分布生成一组随机整数列表,python,algorithm,random,Python,Algorithm,Random,我希望我能解释清楚,如果我不解释,我会再试一次 我想生成一个由5个随机数组成的数组,这些随机数加起来等于10,但其分配是在[0,2n/m]的间隔上选择的 我在用numpy 到目前为止,我的代码如下所示: import numpy as np n=10 m=5 #interval that numbers are generated on randNumbers= np.random.uniform(0,np.divide(np.multiply(2.0,n),fronts),fronts) #

我希望我能解释清楚,如果我不解释,我会再试一次

我想生成一个由5个随机数组成的数组,这些随机数加起来等于10,但其分配是在[0,2n/m]的间隔上选择的

我在用numpy

到目前为止,我的代码如下所示:

import numpy as np

n=10
m=5
#interval that numbers are generated on
randNumbers= np.random.uniform(0,np.divide(np.multiply(2.0,n),fronts),fronts)
#Here I normalize the random numbers
normNumbers = np.divide(randNumbers,np.sum(randNumbers))
#Next I multiply the normalized numbers by n
newList = np.multiply(normNumbers,n)
#Round the numbers two whole numbers
finalList = np.around(newList)

这在很大程度上是可行的,但是四舍五入是错的,它加起来是9或11,而不是10。有没有一种方法可以不必担心舍入错误,或者有没有一种方法可以解决这些问题?如果你想让我说得更清楚一些,我可以,因为我很难解释我在说话时是怎么做的:)。

使用上述技术生成四个数字,然后从10中减去四个数字的总和,以选取最后一个数字。

这将生成所有可能的总和为10的组合,并选择一个随机组合

from itertools import product
from random import choice
n=10
m=5
finalList = choice([x for x in product(*[range(2*n/m+1)]*m) if sum(x) == 10])
也许有一种更有效的方法,但这将在结果之间进行公平的选择

让我们看看当n=10和m=5时这是如何工作的

2*n/m+1=5
,因此表达式变为

finalList = choice([x for x in product(*[range(5)]*5) if sum(x) == 10])
`*[range(5)]*5正在使用参数解包。这相当于

finalList = choice([x for x in product(range(5),range(5),range(5),range(5),range(5)) if sum(x) == 10])
product()
给出了参数的笛卡尔积,在本例中有5**5个元素,但我们过滤掉了那些不加10的元素,剩下381个值的列表


choice()
用于从结果列表中选择随机值

我认为这是正确的。你不能“随机”选择所有五个数字,并期望它们的总和达到一定的值。这不会给出一个“公平”的分布。谢谢你的帮助,但我决定使用第二个答案。这是可行的,但你能解释一下你最后一行的情况吗?就为了让我知道我在用什么?我对python真的很陌生。