问题:
给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一样。现要求使用该函数构造函数rand7(),使函数rand7()可以随机等概率的生成1-7的整数。
解法思路:
当看到这道题的时候,第一个想法就是:利用Rand5() + Rand5()%3 来解决;但是这样得出的结果不是题目所要求的等概率的,这种情况下Rand5()%3产生结果为0的概率为1/5,而产生1或者2的概率为2/5,因此最终产生6和7的概率将大于产生1-5的概率;
正确的解法应该是:构造大的整数区间,限制整数区间,最后映射整数区间.即:使用Rand5()生成1-25这个范围,舍弃掉22-25,只使用1-21范围来映射到1-7这个范围。
比如:
1,2,3 —> 1;
4,5,6 —> 2;
7,8,9 —> 3;
…
代码:
int Rand5()
{
return rand()%5+1;
}
int Rand7()
{
int ret;
while(1)
{