繁体   English   中英

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

[英]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

解决方案可以使用其他发行版,意义是解决问题。

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

from numpy.random import multinomial

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

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

请注意,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值(例如尝试s=100 )导致 bin 以均值 = 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM