rand5生成rand7
rand5 通常指的是一个能够生成 1 到 5 之间随机整数的函数,而 rand7 指的是一个能够生成 1 到 7 之间随机整数的函数。
方法:拒绝采样
核心思想:生成一个范围更大的随机数,然后通过取余数的方式将其缩减到 1 到 7 的范围内。由于 rand5 生成的是 1 到 5 的随机数,因此我们可以利用这个特性来生成一个 1 到 25 的随机数(因为 5*5=25),然后对 7 取余数,最后加 1 来调整范围。
具体的步骤:
1、生成更大的随机数:
首先生成两个 rand5 的结果,分别记为 a 和 b。这样,a 和 b 都是 1 到 5 之间的整数。将 a 和 b 相乘,得到一个 1 到 25 之间的数(因为 5*5=25)。然后,将这个乘积对 7 取余数,得到一个 0 到 6 之间的数。
2、调整范围:
由于需要的是 1 到 7 之间的数,所以我们将上一步得到的余数加 1,这样就能确保结果是 1 到 7 之间的数。
3、拒绝采样:
在这个过程中,我们可能会得到 0,但 0 不在我们想要的范围内(1 到 7)。因此,如果结果是 0,就重新执行上述过程,直到得到一个非零的结果。
public int rand7() {
int num;
do {
// 生成 1 到 25 之间的随机数,然后对 7 取余数
num = (rand5() + (rand5() - 1) * 5) % 7 + 1;
} while (num > 7); // 由于我们的计算结果范围是 1 到 7,所以不需要这个检查
return num;
}