我想列出 N 个随机 INTEGER 数,其总和等于 M 数。
我在 Python 中使用了 numpy 和 dirichlet 函数,但这会生成双随机数数组,我想生成整数随机数。
import numpy as np
np.random.dirichlet(np.ones(n))*m
解决方案可以使用其他分布,感觉就是解决问题。
我想列出 N 个随机 INTEGER 数,其总和等于 M 数。
我在 Python 中使用了 numpy 和 dirichlet 函数,但这会生成双随机数数组,我想生成整数随机数。
import numpy as np
np.random.dirichlet(np.ones(n))*m
解决方案可以使用其他分布,感觉就是解决问题。
使用它的问题dirichlet
在于它是实数的分布。它将产生一个范围内的数字向量(0,1)
,总和为 1,但截断或舍入它们可能会消除对特定总和的保证。在这篇文章之后,我们可以从分布中获得所需的效果multinomial
(使用np.random.multinomial
),如下所示:
from numpy.random import multinomial
np.random.multinomial(m, np.ones(n)/n)
这将生成和n
之间的整数,其和为,绘制给定位置的概率相等。可视化这一点的最简单方法是将结果视为描述从一组固定对象(例如,从 1 到 6 的整数绘制的骰子)中的一组绘制,其中最终数组是相应对象的次数画。总数将始终与给定的总平局(掷骰)数相加。0
m
m
请注意,Dirichlet 分布可用于参数化多项式,从而控制 bin 的平滑度或“均匀性”,例如:
import numpy as np
m = 50
n = 5
s = 0.1
np.random.multinomial(m, np.random.dirichlet(np.ones(n) * s))
主要参数化为@Bonfire,但较大的值s
(例如 try s=100
)导致箱以 mean= 接近泊松,m/n
较小的值导致更大的方差
这是一个示例解决方案:
import numpy as np
M = 50 # The fixed sum
N = 5 # The amount of numbers
array = np.random.multinomial(M, np.ones(N) / N)[0]
print(array)