必须是等概率的。

int rand10()
{
    int i = rand7() - 1;
    int j = rand7() - 1;
    int num = rand7()*i + j;
    if ( num >= 40 ) return rand10();
    else return num%10 + 1;
}

这题一开始我做的时候,我以为直接对这个rand7()乘9然后除以7再加一,,,发现这种方法并不能保证rand10()是等概产生的。

具体的过程是由于我们要得到的是[1,10]的随机数,那么我们可以先对这个区间减去1,得到[0,9]的随机数,然后我们现在的目标就是怎么把这个[0,9]的随机

数生成出来。那怎么得到这个[0,9]的随机数呢,我们发现这个随机数是对一个大于等于10的数字mod10后产生的结果,那么,既然我们知道这个的话,我们就

可以先将rand7()-1,得到[0,6]的随机数,然后将[0,6]的随机数都乘上7得到0,7,14,21,28,35,42. 然后可以对这个7个数字都加上一个rand7()-1,得到一个

[0,48]的数字,得到这个[0,48]的的数字后,我们在每次产生大于等于40的数字后,我们就可以再次调用rand10(),那么实际上就是一个[0,39]的数字

对这个区间中的数字mod10,我们就可以得到4个[0,9]的数字,这个区间的数字刚刚好就是我们想要的了。