如何得到N个和等于M的随机整数

How to get N random integer numbers whose sum is equal to M

我想创建一个列表,其中包含 N 个随机整数,其总和等于 M 个数。

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

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

解决方案可以使用其他发行版感觉是解决了问题。

这是一个示例解决方案:

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)

为此使用 dirichlet 的问题在于它是实数的分布。它将产生 (0,1) 范围内的数字向量,总和为 1,但截断或四舍五入它们可能会取消对特定总和的保证。继this post we can get the desired effect from the multinomial distribution (using np.random.multinomial),如下:

from numpy.random import multinomial

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

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

请注意,Dirichlet 分布可用于参数化多项式,从而控制 bin 的平滑度或 "uniformity",例如:

import numpy as np 

m = 50
n = 5
s = 0.1

np.random.multinomial(m, np.random.dirichlet(np.ones(n) * s))

大部分参数化为 @Bonfire,但 s 的较大值(例如尝试 s=100)导致 bin 接近泊松均值 =m/n 和较小的值导致更大的方差