我希望我能解释清楚,如果我不能解释清楚,我会再试一次。
我想生成一个由 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 的所有可能组合并随机选择一个
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 - 根据分布生成一组随机整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3518597/