我正在尝试实现加权随机数。我目前只是把头撞在墙上,无法弄清楚。
在我的项目(Hold’em hand-ranges,主观全押权益分析)中,我使用了 Boost 的随机函数。所以,假设我想在 1 和 3 之间选择一个随机数(所以是 1、2 或 3)。 Boost 的 mersenne twister 发生器对此很有魅力。但是,我希望选择权重,例如:
1 (weight: 90)
2 (weight: 56)
3 (weight: 4)
Boost 是否为此提供了某种功能?
原文由 nhaa123 发布,翻译遵循 CC BY-SA 4.0 许可协议
有一个简单的算法可以随机选择一个项目,其中项目具有单独的权重:
计算所有权重的总和
选择一个大于等于 0 且小于权重总和的随机数
3)一次检查一个项目,从你的随机数中减去它们的重量,直到你得到随机数小于该项目重量的项目
说明这一点的伪代码:
这应该很容易适应您的 boost 容器等。
如果您的权重很少更改,但您经常随机选择一个,并且只要您的容器存储指向对象的指针或长度超过几十个项目(基本上,您必须分析以了解这是否有帮助或阻碍) ,然后有一个优化:
通过将累积权重和存储在每个项目中,您可以使用 二分搜索 来选择与选择权重相对应的项目。
如果您不知道列表中的项目数,那么有一种非常简洁的算法,称为 水库采样,可以适应加权。