构造随机函数的问题

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;
}
posted @ 2012-07-17 10:45  Cavia  阅读(382)  评论(0编辑  收藏  举报