Weightedrand:Go 權重隨機選擇
weightedrand (github.com/mroth/weightedrand) 是一個 Go 語言實現的權重隨機選擇庫,可以從一個元素列表中以不同的概率選擇一個元素,也就是所謂的加權隨機選擇(weighted random selection)。
你可以爲每個元素設置 “權重”(可以理解爲概率的相對值),然後根據這些權重進行隨機選擇。
安裝
go get github.com/mroth/weightedrand/v2
示例
// rand.Seed(time.Now().UnixNano()) 從 1.20 開始不需要設置
chooser, _ := weightedrand.NewChooser(
weightedrand.NewChoice("A", 10),
weightedrand.NewChoice("B", 20),
weightedrand.NewChoice("C", 70),
)
for range 10 { // 執行10次
result := chooser.Pick()
fmt.Println(result)
}
性能表現
這個庫與 github.com/jmcvetta/randutil 相比:
-
randutil 更適合只執行一次選擇的場景。
-
weightedrand 更適合反覆從同一個集合中選擇的場景。
因爲 weightedrand 會在初始化時構建一個排序好的緩存結構,並使用二分查找來提升查詢速度,尤其在處理大數據集時優勢明顯。
算法原理
該算法的核心思想是:
-
計算累積權重:將每個元素的權重累加,形成一個累積權重列表。例如,給定權重列表 [2, 3, 5],累積權重爲 [2, 5, 10]。
-
生成隨機數:生成一個介於 0 和總權重之和之間的隨機數。例如,生成一個在 [0, 10) 範圍內的隨機數。
-
查找對應區間:在累積權重列表中找到第一個大於該隨機數的值,其對應的索引即爲選中的元素。
這種方法確保了每個元素被選中的概率與其權重成正比。
想深入瞭解背後的算法原理,可以參考這篇博客:Python 中的加權隨機生成(https://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/)。
References
https://github.com/mroth/weightedrand
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ak9wTCha-2vvR4f_VUp4Xg