3

我想列出 N 个随机 INTEGER 数,其总和等于 M 数。

我在 Python 中使用了 numpy 和 dirichlet 函数,但这会生成双随机数数组,我想生成整数随机数。

import numpy as np 
np.random.dirichlet(np.ones(n))*m

解决方案可以使用其他分布,感觉就是解决问题。

4

3 回答 3

5

使用它的问题dirichlet在于它是实数的分布。它将产生一个范围内的数字向量(0,1),总和为 1,但截断或舍入它们可能会消除对特定总和的保证。在这篇文章之后,我们可以从分布中获得所需的效果multinomial(使用np.random.multinomial),如下所示:

from numpy.random import multinomial

np.random.multinomial(m, np.ones(n)/n)

这将生成和n之间的整数,其和为,绘制给定位置的概率相等。可视化这一点的最简单方法是将结果视为描述从一组固定对象(例如,从 1 到 6 的整数绘制的骰子)中的一组绘制,其中最终数组是相应对象的次数画。总数将始终与给定的总平局(掷骰)数相加。0mm

于 2019-12-03T16:50:41.243 回答
1

请注意,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较小的值导致更大的方差

于 2019-12-03T18:26:30.790 回答
0

这是一个示例解决方案:

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)
于 2019-12-03T14:35:02.153 回答