假设我们有一个数字到概率的地图。有没有办法创建一个根据它的概率选择一个键的函数?因此,假设地图包含两个值,2-> 0.55和3-> 0.66。当我调用此函数时,我希望概率确定调用该数字的频率,因此,由于3的概率为66%,因此它将被频繁调用,而不是2(并且恰好是它的概率值)。
有什么想法吗?
答案 0 :(得分:4)
如果您真正想要的是将这些“概率”视为权重,则可以使用std::discrete_distribution
:
std::random_device rd;
std::mt19937 gen(rd());
std::discrete_distribution<> d({0.55, 0.66});
然后当你拨打d(gen)
时,你将获得值为0的值0和值为1的值为0.66的值。这当然意味着获得0的概率实际上是0.55/(0.55+0.66) = 0.45
,因此获得1的概率是1 - 0.45 = 0.55
。
然后,您只需要从0
到2
以及从1
到3
进行映射。
答案 1 :(得分:3)
基本上你需要保留概率列表及其总和。
生成0 <= number < sum
范围内的随机数(使用std::uniform_int_distribution
或std::uniform_real_distribution
,具体取决于类型)。
遍历列表,将值加起来,直到达到大于或等于生成值的值。
您当前所在的号码是随机选择的号码。
如果您有很多值,可以使用一些技巧来加快速度,例如首先对列表最大值进行排序,甚至可能使用跳过列表类型的结构,允许您跳转到某些概率总和列表。通常情况下不需要那种东西,如果你这样做,你必须非常小心,不要弄错并扭曲结果。
答案 2 :(得分:1)
将概率视为“权重”并将它们全部加起来以获得总权重 W 。在0和 W 之间生成随机浮点数 x 。如果0 <= x &lt; W1 (其中 W1 是第一选择的权重),选择第一个数字。如果 W1 &lt; = x&lt; W1 + W2 ,选择第二个数字,依此类推。
答案 3 :(得分:1)
给定一系列元素的概率为“{a =&gt; 0.1,b =&gt; 0.2,c =&gt; 0.3,d =&gt; 0.4}'
总概率必须为1!然后创建一个数组,其中加上像{a=>0.1, b=>0.3, c=>0.6, d=>1}
这样的概率。现在生成0到1之间的随机数。
并检查其较小的0.1选择a
,如果它只是较小的0.3选择b
,依此类推!