4:用RANDOM(0,1)实现RANDOM(a,b):
这道题的实现思路:这个题目相当于在能随机生成 0, 1 的前提下,要求随机生成 n=b-a+1 个整数。
1、把要生成的数标记为 a, a+1, a+2,..., b-a+1,…,b-1,b
2、取最小的 m,使得2^m >= n
3、通过随机生成 0,1 的函数生成一个 m 比特整数(随机生成每一位),这样能随机生成[0, 2^m)内的整数。
4、随机生成一个 [0,2^m) 中的整数,如果这个数加a大小在 [a, b] 内,则取这个数为结果。如果这个数加a在 [a, b] 外,则丢弃它,重新生成一个。
int getBit(int a,int b)
{
int n = b - a + 1; //n表示个数
int bit = 0;
int value = 1; //value = 2^bit
while (value < n)
{
bit++;
value = value << 1;
}
return bit;
}
int random_a_b(inta, int b)
{
int bit = getBit(a, b);
int flag;
int result = 0;
while (true)
{
for (int i = 0; i < bit; i++)
{
flag = random_0_1();
flag = flag << i;
result |= flag;
}
if (result + a > b)
{
result = 0;
continue;
}
else
break;
}
return result + a;
}
5:random(0,1)以概率p返回0,以概率(1-p)返回1。基于它实现random2(0,1),各以1/2的概率返回0和1.
while(true)
{
x=random(0, 1);
y=random(0, 1);
if(x != y)
return x;
}
该算法,只有在(x,y) = (1,0)或者(0,1)的情况下,才会返回,返回值为第一个数,因为用random(0,1)生成(1,0)或者(0,1) 的概率为p(1-p),两者生成的概率是相同的,所以,返回1和返回0的概率分别为1/2。第一题类似的原理,函数内部,用random(0,1)生成[0,b-a+1]中每个数的概率都是1/ 。所以,生成[0,b-a+1]中每个数的概率是相同的,因而返回每一个数的概率也是相同的。