这种题要分两步,第一步是“插空儿”,第二步是“筛”
1.rand7生成rand10
只要是10的倍数就好
int rand10() {
int num;
do{
num = (rand7() - 1) * 7 + rand7() - 1;
}
while(num >= 40);
return num % 10 + 1;
}
概率计算:
再将这49个数分为两部分, {0, 1, 2, ... , 39}和{40, 41, .., 48},如果生成的数处于第2部分,再将第二部分等概率分到第1部分,总概率 =
2.rand01生成rand6(这个是面试指南上的题目)
int rand03(){
return rand01() * 2 + rand01();
}
int rand6(){
int num;
do{
num = rand03() * 4 + rand03();
}
while(num >= 12);
return num % 6 + 1;
}
第二题稍稍改改:rand01是一个以p概率产生0以1-p概率产生1的随机函数
这个时候就需要把rand01改成等概率的rand01p
int rand01p(){
int num;
do{
num = rand01();
}
while(num == rand01());
return num;
}
3.rand2生成rand5
int rand03(){
return (rand2 - 1) * 2 + rand2 - 1;
}
int rand5(){
int num;
do{
num = rand03() * 4 + rand03();
}
while(num > 14);
return num % 5 + 1;
}
2经过插空儿后无法大于5,或者说5的倍数,所以只能通过辅助的生成03这种方式再来生成一次