使用随机数生成器生成具有给定期望值的数字

时间:2013-06-20 20:47:58

标签: random probability

我遇到了以下问题:

使用rand()函数,生成一个期望值为k的数字。选项包括:

1)

   int GetRandom(int k)
   {
       v=0;
       while(rand()<1.0f/(float)k)
           v++; 
       return v;
    }

2)

   int GetRandom(int k)
   {
       v=0;
       while(rand()<(1-1.0f/(float)k))
           v++; 
       return v;
    }

3)

   int GetRandom(int k)
   {
       v=0;
       while(rand() > (1-1.0f/(float)(k+1)))
           v++; 
       return v;
    }

1)似乎是正确的答案。检查k的具体值的结果似乎表明情况并非如此。 (我设置k=3100000试验的值的频率分布可以在下面的图片中看到

如何做到这一点?

这个问题有点类似于this一个。

1 个答案:

答案 0 :(得分:3)

你想要(2)。这会使Geometric Distribution (link)采样均值为k

几何分布代表了这种实验:

  • 某个事件重复发生,结果为0或1
  • 事件的结果为1,概率p为0,概率为1-p
  • 结果为1的第一个事件的索引是什么?

因此,如果X ~ G(p),其中X是随机变量且p是上述概率,则X表示“第一个事件的索引是什么结果1?“期望值为E[X] = 1/p

鉴于此信息,现在应该清楚,以下代表随机变量Xp = 1/k的抽样(相当于(2))。

int Sample(int k)
{
    int v = 1;
    while (true)
    {
        //outcome is true with probability p = 1/k
        bool outcome = rand() < 1 / (double)k;
        if (outcome)
            return v;
        else
            v++;
    }
}

请注意,查看分配的峰值(模式)和期望并不是一回事。几何分布的峰值始终为1!