只调用random(0, 1),实现random(a, b)

来源:互联网 发布:双网卡双网络设置 编辑:程序博客网 时间:2024/05/21 23:55

只调用random(0, 1),实现random(a, b)?


random(0, 1),50%为0,50%为1


random(a, b),b-a+1个数,调用random(0,1)后采取某种方法得到a~b之间。


2^n = m < b-a+1,bit表示此二进制值的位数

思路:找到包含b-a+1范围的二进制数,random(0,1)求和,相当于二进制的每一位都是等概率的值,结果也是等概率???求证明


while( value < b - a + 1)

{

    bit++;

    value = value << 1;

}


result = 0;

for(i=0; i < bit; i++)

{

    k = random(0, 1);

    result = result + k;


   当i=bit-1,即达到bit位时,查看此时reuslt是否在范围内

    if ( result> a && result < b)

        return result; // 此时的结果为random(a,b)等概率的值

    else

       i = 0; // 重新开始循环,

}

0 0