题目:
给定一个随机函数rand(),以p的概率产生0,以1-p的概率产生1,要求设计一个新的随机函数,要求以1/n的概率产生1-n之间的一个数。
思路:
(1)通过随机函数rand()产生等概率的0和1的新随机函数rand_1()
(2)调用k次(k为n的二机制表示的位数)rand_1(),得到一个位长为k的0和1的序列
(3)上面产生的k个0/1序列表示1-n之间的数。
注意:
如果如果产生的序列大于n,则重新产生直到产生的序列对应的值小于n
(1):产生rand_1()
int rand_1()
{
int a = rand();
int b = rand();
if (a == 0 && b == 1)
return 1;
else if (a == 1 && b == 0)
return 0;
else
return rand_1();
}
(2) 生成k,k=1 + log2(n)
(3)生成k个0/1序列
new_rand()
{
int i = 0;
for (i = 0; i < k; i++) {
if (rand_1() == 1)
result |= (1 << i)
}
if (result > n)
return new_rand();
}