问题:有函数rand5(),它能够等概率生成[0,5)之间的整数。由rand5()构造rand(n)使其能够等概率生成[0,n)之间的整数。
思路1:有rand5()先生成等概率生成0和1的rand01(),有了rand01就可以像上一篇文章一样生成rand(n)。
思路2:rand5和rand01有何区别?一个是生成01,一个是生成01234,(一个以2为基,一个以5为基),既然rand01能用来构造rand(n),那么rand5也可以通过同样的原理得到rand(n).
Java代码:
//用rand5生成rand(n) public int rand2(int n){ while(true){ int v=0; int base=1; int bits=(int)Math.ceil((Math.log(n)/Math.log(5))); for(int i=0;i<bits;i++){ v+=rand5()*base; base*=5; } if(v<n){ return v; } } }