如何创建一个根据概率选择数字的函数?

时间:2014-01-16 22:16:52

标签: c++

假设我们有一个数字到概率的地图。有没有办法创建一个根据它的概率选择一个键的函数?因此,假设地图包含两个值,2-> 0.55和3-> 0.66。当我调用此函数时,我希望概率确定调用该数字的频率,因此,由于3的概率为66%,因此它将被频繁调用,而不是2(并且恰好是它的概率值)。

有什么想法吗?

4 个答案:

答案 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

然后,您只需要从02以及从13进行映射。

答案 1 :(得分:3)

基本上你需要保留概率列表及其总和。

生成0 <= number < sum范围内的随机数(使用std::uniform_int_distributionstd::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,依此类推!