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

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

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

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

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


繁华开满天机
浏览 176回答 3
3回答

元芳怎么了

使用它的问题dirichlet在于它是实数的分布。它将产生一个范围内的数字向量(0,1),总和为 1,但截断或舍入它们可能会消除对特定总和的保证。在这篇文章之后,我们可以从分布中获得所需的效果multinomial(使用np.random.multinomial),如下所示:from numpy.random import multinomialnp.random.multinomial(m, np.ones(n)/n)这将生成和n之间的整数,其和为,绘制给定位置的概率相等。可视化这一点的最简单方法是将结果视为描述从一组固定对象(例如,从 1 到 6 的整数绘制的骰子)中的一组绘图,其中最终数组是相应对象的次数画。总数将始终与给定的总平局(掷骰)数相加。0mm

哔哔one

请注意,Dirichlet 分布可用于参数化多项式,从而控制 bin 的平滑度或“均匀性”,例如:import numpy as np m = 50n = 5s = 0.1np.random.multinomial(m, np.random.dirichlet(np.ones(n) * s))主要参数化为@Bonfire,但较大的值s(例如 try s=100)导致 bin 以 mean= 接近 Poisson,m/n较小的值导致更大的方差

慕姐4208626

这是一个示例解决方案:import numpy as npM = 50 # The fixed sumN = 5 # The amount of numbersarray = np.random.multinomial(M, np.ones(N) / N)[0]print(array)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript