从数字列表中随机选择一个偏向最低数字的数字

时间:2018-09-18 12:51:29

标签: c++

在每一个时刻t,我都有一组不同的正整数。我需要随机选择其中之一,以满足要从集合中选择特定数字的概率必须成比例地较高的标准,该数字的值越小。在时刻t + 1,我们有另一组正整数,同样,我们需要选择一个满足相同准则的整数。依此类推。如何在C ++中做到这一点?

2 个答案:

答案 0 :(得分:0)

一种方法是为每个数字分配范围,将一个值随机化,然后选择具有包含随机值的范围的数字。

示例

输入:

1 2 3

范围:

[0,300) [300, 450) [450, 550)

每个数字的概率:

~55% ~27% ~18% 

具有0到550之间的随机值,例如1351起,所选号码将为0 <= 135 < 300

关于在C ++中的操作方式,请先尝试一下。

答案 1 :(得分:0)

您所说的基本上是Geometric distribution,或者至少是它的切碎和标准化的变种。

C ++ 11包含一个geometric distribution generator,并且您可以根据需要直接使用它,但是为了使事情变得简单,您还可以执行以下操作:

int genRandom(int count)
{
    while(true)
    {
        int x = 0;
        while(x < count-1)
        {
            if(rand() < RAND_MAX/2) // with probability 0.5...
            {
                return x;
            }
            x++;
        }
    }
}

请注意,这里我使用拒绝采样来确保选择一个值,而不是如果我超过它就返回count-1(这将使后两项相等的可能性)。