算法导论习题5.1-2
描述RANDOM(a, b)过程的一种实现,它只调用RANDOM(0, 1)。
原理:算出a和b之间的差距d,求得最小的bit位数,使其恰好大于d,通过random(0, 1)来置位二进制位,然后加上a,如果该值落在[a, b]之间,满足条件,否则丢掉改值,继续寻找其他值!
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
int random_0_1()
{
return rand() % 2;
}
int getBit(int a, int b)
{
int n = b - a + 1;
int bit = 0;
int value = 1;
while (value < n)
{
bit++;
value = value << 1;
}
return bit;
}
int random_a_b(int a, 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;
}
void main()
{
srand(unsigned(time(NULL)));
for (int i = 0; i < 100; i++)
{
int result = random_a_b(5, 10);
cout << "result: " << result << endl;
}
}