首頁 >後端開發 >C++ >如何使用Boost函式庫產生加權隨機數?

如何使用Boost函式庫產生加權隨機數?

Barbara Streisand
Barbara Streisand原創
2024-12-20 20:14:10888瀏覽

How Can I Generate Weighted Random Numbers Using the Boost Library?

Boost 中的加權隨機數

Boost 庫提供了廣泛的隨機數產生功能。雖然它提供簡單的隨機數生成,但缺乏對加權隨機數的內建支援。本文探討了使用原始 Boost 函數實現加權隨機數選取的技術。

加權隨機化演算法

要產生加權隨機數,我們可以採用以下演算法:

  1. 計算所有的總和權重。
  2. 產生一個介於 0 和權重總和(含)之間的隨機數。
  3. 迭代地從隨機數中減去權重,直到其變為負數。目前item的索引就是選擇的加權數。

適配Boost

演算法可以適配Boost如下:

using namespace boost;

int weightedRandom(const std::vector<int>& weights) {
  // Calculate the sum of weights
  int sum = accumulate(weights.begin(), weights.end(), 0);

  // Generate a random number between 0 and the sum
  variate_generator<mt19937, uniform_int_distribution<int>> rand(generator());
  int rnd = rand(sum);

  // Traverse weights and subtract until random number becomes negative
  for (size_t i = 0; i < weights.size(); ++i) {
    if (rnd - weights[i] < 0) {
      return i;
    }
    rnd -= weights[i];
  }

  // Should never reach here
  assert(false);
}

最佳化不變權重

如果權重很少改變且清單相當長,我們可以透過預先計算累積權重總和並使用二分搜尋來最佳化。

未知列表大小的儲層採樣

對於大小未知的列表,可以採用加權的水庫採樣

結論

雖然Boost 缺乏專用的加權隨機數函數,但所提出的技術可以使用原始Boost 函數實現高效、準確的生成。

以上是如何使用Boost函式庫產生加權隨機數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn