构造随机函数的问题

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;

}

你可能感兴趣的:(函数)