我遇到了以下问题:
使用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=3
。100000
试验的值的频率分布可以在下面的图片中看到)
如何做到这一点?
这个问题有点类似于this一个。
答案 0 :(得分:3)
你想要(2)。这会使Geometric Distribution
(link)采样均值为k
。
几何分布代表了这种实验:
p
为0,概率为1-p
因此,如果X ~ G(p)
,其中X
是随机变量且p
是上述概率,则X
表示“第一个事件的索引是什么结果1?“期望值为E[X] = 1/p
。
鉴于此信息,现在应该清楚,以下代表随机变量X
与p = 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!