编程题目:已知有一个函数rand()可以生成1~5之间的整数随机数,其结果每个数的概率均匀分布,尝试写出一个可以生成1~7之间的整数随机数的函数,且每个数均匀分布。
解法:题目需要一个能够获得1~7之间整数的函数,并且得到每个数的概率都是严格的1/7。
如果只是得到1-7的话很简单,例如 (rand() + rand() % 3),但这样的话,每个数的概率不同,例如7只能由5+2一种组合得到,概率是1/25,而4可以由2+2、3+1和4+0三种组合得到,概率是3/25。顺着这个思路,我们需要想一个公式或算法,让每个数出现的概率相同。
下面是我给出的解法:
int getRandom1_5()
{
int radomNum;
//srand((unsigned int)time(0));//每次调用这个就完全不随机了~
radomNum = rand() % 5 + 1;
return radomNum;
}
int main()
{
/* 由生成1-5随机数的函数来生成1-7随机数 */
int numCount[7] = {0};
int radomNum;
int i;
srand((unsigned int)time(NULL)); //以时间为种子,time()精确到s
for (i = 0; i < 10000; i++)
{
reCul:
//关键在获得每个数的次数(概率)相等。即每个数只能由一种组合得到
radomNum = 5 * (getRandom1_5() - 1) + getRandom1_5();
if (radomNum > 7)
{
goto reCul;//范围之外就抛弃此次结果重新来一遍
}
numCount[radomNum - 1]++;
//usleep(200);
}
for (i = 0; i < 7; i++)
{
printf("%d: %d\n", i + 1, numCount[i]);
//cout << i + 1 << radomNum[i] << endl;
}
return 0;
}