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

时间:2010-08-19 03:50:13

标签: 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.有没有办法做我想做的事情而不用担心舍入错误,或者也许解决这些问题的方法?如果你想让我更清楚,我可以,因为我在谈论时,我无法解释我正在尝试做些什么:)。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这会生成所有可能的总和为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个值的列表< / p>

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