2012年 雅虎北京研发中心 电话面试的一道概率题

题目:已知一随机发生器A,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器B, 使得它构造0和1的概率均为1/2。

 

初看确实有点头晕,也没什么思路。但是仔细想想为什么生成0和1的概率均为1/2,我们可以看成是生成0和1的概率是均等的。这样想之后,似乎就没那么不好理解了。

原始的随机数生成器,生成0 的概率为p,生成1的概率为1-p,那么怎么构造才能使得生成0和1的概率相等呢。或者说有两个独立的事件的概率是相等呢?

这样来做一下,让该随机数生成器生成两个数,那么序列是00,01,10,11概率分别为 p*p,p(1-p),(1-p)p,(1-p)*(1-p)

很明显,这四种情况中存在两个独立的事件概率是相等。也就是01和10,那么我把01看成是0,10看成是1,那么他们输出的概率均为p(1-p),其他的情况舍弃。这样就得到了0和1均等生成的随机器了。

上述思想的伪代码实现如下:

F(X):

P(F(X)=1)=1-P;

P(F(X)=0)=P;

G(X):

P(G(X)=0)=P(F(X)>0)=1-P;   //G(x)以概率 1-p 生成0

P(G(X)=1)=P(F(X)<=0)=P;

P(G(X)=0&& F(X)=0)=(1-P) * P;

P(G(X)=1&& F(X)=1)=P * (1-P);

P(G(X)=1&& F(X)=0)=P* P;

P(G(X)=0&& F(X)=1)=(1-P) * (1-P);

Z(X)

{

    X=G(X)+F(X);       

    IF(X==0)          //X为0的概率为G(X)生成0的概率乘以F(X)生成0的概率,即为(1-p)*p

        RETURN 0;

    ELSE IF(X==2)

        RETURN 1;

    ELSE

        RETURN Z(X);

}

 

题目再变形一下,如果有该随机发生器A,输入一个指定的N,如何以以1/N的概率随机产生1-N?

 

借助于上面生成0、1的思想,有如下生成代码:

 

Y(X)

{

    int k=log2(N)+1;               //bit位数,即k位二进制位就足够表示N个数

    int res=0;

    for(int i=0;i<k;++i)            //对于每一位二进制位

        IF(Z(X)==1)                 //调用上面的随机发生器B,以同等概率生成0与1

            res = res | 1<<i;      //将res对于的第 i 位置为1

    IF(res>N)                        //如果生成的数超过N,则再随一次。比如N为10,则k为4,res在此可能为11、12、13、14、15其中的一个!

        RETURN Y(X);

    else                               

        RETURN res;

}

 

备注:以上伪代码参考自:http://zhangziyueup.iteye.com/blog/1334006

 

 

附加一道概率思考题,

据说是腾讯面试题:

已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。

利用的方法和上个问题类似,如何能够得到一个等概率的独立事件。这个问题和上个问题不同的是,这里产生的序列,要变成和的形式或者其他的形式,那么概率就会发生变化了。

如果能够得到一组等概率的数,不管是什么数,只要等概率而且个数大于10,那么问题就可以解决了。

发现 (rand7() - 1) * 7 + rand7(),可以等概率的生成1到49。

呵呵,这不就得了,只要把11-49砍掉就可以了。不过这样的效率比较低。可以砍掉41-49,然后在把1-40映射到1-10,那么问题也就解决了。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值