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 相比:

因爲 weightedrand 會在初始化時構建一個排序好的緩存結構,並使用二分查找來提升查詢速度,尤其在處理大數據集時優勢明顯。

算法原理

該算法的核心思想是:

這種方法確保了每個元素被選中的概率與其權重成正比。

想深入瞭解背後的算法原理,可以參考這篇博客: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