构造随机函数的问题
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; }