https://blog.csdn.net/wolfGuiDao/article/details/107356211?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

    *
    `5
    (Rand5() - 1) + Rand5();`

    • 第一个Rand5产生1到5的随机数,减1就产生0到4的随机数,乘以5后可以产生的随机数是:0,5,10,15,20。
    • 第二个Rand5()产生的随机数是1,2,3,4,5。那么我们可以得到1到25的随机数, 而且每个数都只由一种组合得到,即**上述代码可以等概率地生成1到25**。
    • OK, 到这基本上也就解决了.
    1. int Rand5(){};
    2. int Rand7()
    3. {
    4. int num = INT_MAX;
    5. while(num > 7)
    6. num = 5 * (Rand5() - 1) + Rand5();
    7. return num;
    8. }
    • 因为Rand25会产生1到25的数,而只有1到7时才跳出while循环, 生成大部分的数都舍弃掉了。这样的实现明显不好,我们应该让舍弃的数尽量少
    • 于是我们可以修改while中的判断条件,让x与(最接近25)且(小于25)的(7的倍数)相比。
    • 于是判断条件可改为x > 21,于是x的取值就是1到21。 我们再通过取模运算把它映射到1-7即可 ```java int Rand5(){};

    int Rand7() { int num = INT_MAX; while(num > 21) num = 5 * (Rand5() - 1) + Rand5(); return num % 7 + 1; }

    1. **如果`给你两个生成随机数的函数Randa和Randb, 你可以通过以下方式轻松构造Randab,生成1到a*b的随机数`。**
    2. ```java
    3. Randab = b * (Randa - 1) + Randb
    4. Randab = a * (Randb - 1) + Randa