生成多個隨機金額的演算法該怎麼寫?

時間 2021-10-18 18:28:30

1樓:

這個問題有乙個非常合適的數學工具可以解決,叫做狄利克雷分布,詳細資訊可以參考wikipedia.org 的頁面。

簡單來說乙個N維的狄利克雷分布的乙個樣本就是乙個N維的向量,這個向量的每個元素都是正的,而且相加等於1,即0, \sum_^Nw_i=1" eeimg="1"/>

有了這個強有力的工具你的問題就解決一大半了。

首先你可以通過一些數學函式庫生成乙個N維狄利克雷分布的樣本,然後用這個向量乘以總金額就得到了對應的N個隨機金額。順帶提一句,這個狄利克雷分布可以是對稱的,也可以是非對稱的,指定不同引數即可。

接下來你提到了乙個隨機金額區間的限定。

首先我覺得這樣乙個限定並不是很嚴格,比如100塊錢生成10個金額,每乙個金額要求50~100塊錢,這顯然是不可能的。那麼就假設你這個金額區間提的還算合理,能保證有解,並且真的有很多解以支撐一定的隨機性(比如100塊錢分10份,每份求10~20,只有乙個解,並沒有隨機性)。

在數學上這就是對隨機向量w的乙個約束,有了這個約束,w的分布就不是完整的狄利克雷分布了,而是在可行域內正比於狄利克雷分布,在可行域之外恒為零的乙個「分段式」分布。

對這樣分布的隨機變數進行取樣,乙個直接的方法就是使用Rejection sampling技術(不知道中文叫啥),這樣就有了第乙個演算法:

重複對狄利克雷分布取樣,並根據總金額M計算N個金額

對N個金額逐一檢驗,如果有某個金額不滿足區間要求則拋棄這乙個樣本,回到第1步重新取樣,如果滿足要求則得到了一組N個隨機金額

當然直觀來看這樣效率也不是很高,因為好多樣本可能就因為區間限制被扔掉了。可以稍微做一點改進,假設你要求總金額為M,總共生成N個隨機金額並且每個金額都要在區間[a,b]中,那麼不妨你就先嘗試做這樣乙個問題:從M-Na的總金額中生成N個金額,並要求每個金額在區間[0,b-a]中。

這個問題可以第乙個演算法求解,得到一組解之後,每個金額加上a即可。

因為乙個N維的狄利克雷分布又可以通過N-1個beta分布構造出來。所以你也可以逐個生成金額並檢驗、拋棄。不過這樣乙個演算法可能控制流寫起來比較麻煩。

另外,如果你採用狄利克雷過程的話,可以甚至N都不指定,可以隨機生成隨機數目個隨機金額。

如何評價乙個偽隨機數生成演算法的優劣?

Sisi H 本來是來這裡看看能不能幫我完成作業的,看了看發現我老師說得還挺全的。截老師的三張ppt 王建新 NIST SP800 22中規定了隨機數隨機性測試方法,共16個測試項,必選項15個,是國際上比較權威的測試方法,國密局的隨機數測試規範也參考了這個標準。按照此標準測試有開源的測試工具 st...

泊松隨機數的生成演算法 數學推導和程式實現

書衣活 很巧,這兩天分別盡了適馬30 1.4 40 1.4兩支鏡頭,分別搭配尼康D3100和D5600。跑焦,都跑,用調焦底座,拍攝對焦卡,基本上沒問題後,再實拍人,繼續微調。調準後合焦概率挺大的。D5600配適馬40 1.4今天晚上終於調整成功了,鏡頭分別做了 1 3 7 4的調整。室內拍人無壓力...

網上常能見到的一段 JS 隨機數生成演算法如下,為什麼用 9301, 49297, 233280 這三個數字做基數?

franky 為啥不用random?新瀏覽器可能會用音效卡噪音因素加入到隨機數生成的方法中去。在瀏覽器裡玩的話,如果自己來搞,也許陀螺儀等裝置的一些資訊的加入。也可以增加隨機演算法的健壯性。如果再加入一些使用者態比如滑鼠座標滾動條位置啊等等都參與其中都可以把隨機性這件事做到更好會不會更有趣些? mo...