有效的 Java 项目 47:了解和使用您的库 - 有缺陷的随机整数方法示例
在Josh给出的有缺陷的随机方法的例子中,它生成一个具有给定上限的正随机数,我不明白他所说的两个缺陷。n
书中的方法是:
private static final Random rnd = new Random();
//Common but deeply flawed
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
- 他说,如果n是2的小幂,那么生成的随机数序列将在短时间内重复。为什么会这样?的文档说,所以不应该是如果n是一个小整数,那么序列将重复自己,为什么这只适用于2的幂?
Random.nextInt()
Returns the next pseudorandom, uniformly distributed int value from this random number generator's sequence.
- 接下来,他说,如果n不是2的幂,那么一些数字的平均返回频率将高于其他数字。如果生成均匀分布的随机整数,为什么会发生这种情况?(他提供了一个代码片段,清楚地证明了这一点,但我不明白为什么会这样,以及这与n是2的幂有什么关系)。
Random.nextInt()