题目一:已知rand7()可以产生1~7的7个数(均匀概率),利用rand7() 产 生 rand10() 1~10(均匀概率)。
int rand10(){
int temp1,temp2;
do{
temp1=rand7();
}while(temp1>5);//产生1~5
do{
temp2=rand7();
}while(temp2>2);//产生1~2
return temp1+5*(temp2-1);
}
分析:rand7产生的数概率是一样的,即1~7出现的概率一样,由于对结果做了筛选只能产生1~5,并且其概率也是一样的,所以temp1出现1~5的概率为1/5,同理temp 1~2的概率为1/2.
1)temp1出现1~5的概率为1/5,temp2 1~2的概率为1/2,则5*(temp2-1)出现0,5的概率为1/2,所以如果要得到1~5的数,则5*(temp2-1)必须为0,所以num的概率为:1/2*1/5=1/10同理得到大于5时候的数的概率也是1/10
思路二:
int rand10()
{
int x=0;
do{
x=(rand7()-1)*7+rand7();
} while(x>40);
return x%10+1;
}
解释:
x=(rand7()-1)*7+rand7();
这里的x范围是1到49,等概率产生的,都是1/49
1到49之间有1到10,11到20,21到30,31到40,只要%10然后+1,就是等概率的1到10,但是41到49,不够1到10,其实while(x>20);while(x>30);都是对的,就是效率差了点。
另一个观点就是把x=(rand7()-1)*7+rand7() 看成2位的7进制数。