首页 >后端开发 >C++ >如何使用Boost库生成加权随机数?

如何使用Boost库生成加权随机数?

Barbara Streisand
Barbara Streisand原创
2024-12-20 20:14:10849浏览

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