Boost 中的加權隨機數
Boost 庫提供了廣泛的隨機數產生功能。雖然它提供簡單的隨機數生成,但缺乏對加權隨機數的內建支援。本文探討了使用原始 Boost 函數實現加權隨機數選取的技術。
加權隨機化演算法
要產生加權隨機數,我們可以採用以下演算法:
適配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中文網其他相關文章!