今天笔试题考到了,自己提的方法是N次调用,生成的0的个数与N相比,比值和p的大小比。。。
以前经常见这道题,从来没看过。。。今天网上搜了一下,网上解法模板略有错误,小改一下:
设f'(x)=f(x)>0?0:1; 则f'(x)以概率 1-p 生成0.
所以f(x),f'(x)同时生成0的概率为p(1-p),同时生成1的概率也为p(1-p).
得等概率随机数
function g(x) { int v = f(x) + f(x)>0?0:1; if(v==0) { return 0; //1.f(x),f'(x)同时为0 } else if(v==2) { return 1; //2.f(x),f'(x)同时为1 } else { g(x); //3.f(x),f'(x)一个为0一个为1,重新生成随机数 } }
上面第3步的概率为p^2+(1-p)^2