在每一个时刻t,我都有一组不同的正整数。我需要随机选择其中之一,以满足要从集合中选择特定数字的概率必须成比例地较高的标准,该数字的值越小。在时刻t + 1,我们有另一组正整数,同样,我们需要选择一个满足相同准则的整数。依此类推。如何在C ++中做到这一点?
答案 0 :(得分:0)
一种方法是为每个数字分配范围,将一个值随机化,然后选择具有包含随机值的范围的数字。
示例
输入:
1 2 3
范围:
[0,300) [300, 450) [450, 550)
每个数字的概率:
~55% ~27% ~18%
具有0到550之间的随机值,例如135
自1
起,所选号码将为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(这将使后两项相等的可能性)。