如何实现任何一个概率的随机函数

今天看到有人面到一类似题,但是更简单一些。给定一个随机函数可以按照0.5的概率返回true,如何实现一个函数按照1/2^N的概率返回true。这让我想到了去年做过的一道Facebook的面试题。那道题比这个更难,要求实现一个函数随机返回任意概率的true。以下是我当时给出的解答。由于我给出了这个解,使得我有幸认识了版上的几个大牛,包括LeetCode。本来想把这个写到我的算法路里,不过由于正好有人面到了类似题,就给大家参考一下吧。
 

 

boolean Prob()

{

    return new Random().nextInt(2)==0;

}

 

boolean Prob2(double p, boolean expected)

{

    if(p<0.5)

        return Prob2(1-p,!expected);

    

    if(Prob()==expected)

        return expected;

    else

        return Prob2((p-0.5)*2, expected);

}

有的网友希望能够解释一下。那么我举个例子吧。
1. 如果你想求0.4的概率true,那么就等于你求0.6的概率false。
2. 如果你想求0.6的概率false,那么如果你从Prob得到了false,你就可以返回false了,因为Prob的概率是0.5,小于0.6。
3. 如果你从Prob返回的是true,那么你已经用掉了0.5的概率了,你只剩0.1的概率了。那么下一次call Prob你需要的0.2概率的false。这样你就是按照0.6的概率去得false的 0.5+0.5*0.2=0.6
 
先copy Peking2的解法,完了我再好好研究下
posted @ 2013-06-12 18:38  一只会思考的猪  阅读(363)  评论(0编辑  收藏  举报