簡體   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