思路
两次调用该RANDOM函数,如果其概率为P(x),调用2次
P(1) = p P(0) = 1-p
P'(1) =p P'(0) = 1-p
概率如下:
11 p*p 10 p*(1-p)
01 (1-p)*p 00 (1-p)*(1-p)
代码:
int Rand()
{
int i1 = rand();
int i2 = rand();
if(i1==0 && i2==1)
return 1;
else if(i1==1 && i2==0)
return 0;
else
return Rand();
return -1;
}
扩展
等概率生成[1, n]之间的随机数。
首先计算整数n的二进制表示所拥有的位数k,k = 1 +log2n(log以2为底n) 。
然后调用k次Rand()产生随机数。
代码
int newRand()
{
int result = 0;
for(int i = 0 ; i < k ; ++i)
{
if(Rand() == 1)
result |= (1<<i);
}
if(result > n)
return newRand();
return result;
}