*
`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, 到这基本上也就解决了.
int Rand5(){};
int Rand7()
{
int num = INT_MAX;
while(num > 7)
num = 5 * (Rand5() - 1) + Rand5();
return num;
}
- 因为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; }
**如果`给你两个生成随机数的函数Randa和Randb, 你可以通过以下方式轻松构造Randab,生成1到a*b的随机数`。**
```java
Randab = b * (Randa - 1) + Randb
Randab = a * (Randb - 1) + Randa