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中文网其他相关文章!