我希望我能解释清楚,如果我不这样做,我会再试一次。
我想生成一个包含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.有没有办法做我想做的事情而不用担心舍入错误,或者也许解决这些问题的方法?如果你想让我更清楚,我可以,因为我在谈论时,我无法解释我正在尝试做些什么:)。
答案 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()
用于从结果列表中选择随机值