python - 根据分布生成一组随机整数列表

标签 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)
#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/

相关文章:

.net - Microsoft GraphEngine LIKQ 查询

random - 维基数据 SPARQL 接口(interface) : order by random

c++ - C++ 中的 Random() 效率

Python:Scrapy CSV 导出不正确?

python - 在 while 循环中使用 python 的 core.Clock.GetTime() 方法 : timing distortions?

python - 复制模型实例和相关模型的更好方法

algorithm - 伪代码中的负数组索引

python - 比较测验的两种不同解决方案

ios - 64 位随机种子

python - 类型错误:字符串索引必须是整数(使用 pandas Dataframe)