我希望生成一个长度为N的随机整数序列,其总和为M。
我尝试使用Python中的numpy和dirichlet函数,但是它们生成的是双精度浮点数数组,而我需要生成随机整数。
import numpy as np
np.random.dirichlet(np.ones(n))*m
解决方案可以使用其他分发方式,即解决问题的方法。
我希望生成一个长度为N的随机整数序列,其总和为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
个介于0
和m
之间的整数,它们的总和为m
,在抽取给定位置时具有相等的概率。最简单的方式是将结果视为从一组固定对象(例如,掷骰子从1到6的整数)中进行抽取的一组绘画,其中最终数组是相应对象被抽取的次数。总数将始终汇总到给定的总绘制数(掷骰子)。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)
import numpy as np
m = 50
n = 5
s = 0.1
np.random.multinomial(m, np.random.dirichlet(np.ones(n) * s))