构造随机函数的问题
Q:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10
A:要构造rand10(),则需要保证1-10的每一个数出现的概率为1/10。rand7()能够出现1-7的等概率数字,两次rand7()能出现49种等概率的数字,而如果我们有0-48这49种数字num的话,则当num<40的前提下,num/4+1就能构造出1-10这十个数字,并且每个数字出现的概率1/10(num=0,1,2,3构造出1,num=4,5,6,7构造出2,依次类推)。
现在问题的关键是两次rand7()怎么产生出0-48这49种数字。我们可以把他看成一个7x7的矩阵,矩阵看成一维数组的话下标就是0-48,那么我们可以用求矩阵下标的方法产生0-48这49种数字。问题解决。
int rand7()
{
return rand()%7+1;
}
int rand10()
{
int c;
do
{
int a=rand7()-1;
int b=rand7()-1;
c=a*7+b;
} while (c>=40);
return c/4+1;
}
浙公网安备 33010602011771号