版权声明:转载请注明出处。 https://blog.csdn.net/u014427196/article/details/40357517

##

必须是等概率的。

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;
}

[

](https://github.com/ybai62868/Interview/blob/master/rand7\(\)-%3Erand10\(\).md#%E8%BF%99%E9%A2%98%E4%B8%80%E5%BC%80%E5%A7%8B%E6%88%91%E5%81%9A%E7%9A%84%E6%97%B6%E5%80%99%E6%88%91%E4%BB%A5%E4%B8%BA%E7%9B%B4%E6%8E%A5%E5%AF%B9%E8%BF%99%E4%B8%AArand7%E4%B9%989%E7%84%B6%E5%90%8E%E9%99%A4%E4%BB%A57%E5%86%8D%E5%8A%A0%E4%B8%80%E5%8F%91%E7%8E%B0%E8%BF%99%E7%A7%8D%E6%96%B9%E6%B3%95%E5%B9%B6%E4%B8%8D%E8%83%BD%E4%BF%9D%E8%AF%81rand10%E6%98%AF%E7%AD%89%E6%A6%82%E4%BA%A7%E7%94%9F%E7%9A%84)
这题一开始我做的时候,我以为直接对这个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]的数字,这个区间的数字刚刚好就是我们想要的了。