[英]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)
這將生成0
和m
之間的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.