В примере 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, последовательность генерируемых случайных чисел будет повторяться через короткий промежуток времени. Почему это так? Документация для
Random.nextInt()
говоритReturns the next pseudorandom, uniformly distributed int value from this random number generator sequence.
Так что не должно быть, что если n - небольшое целое число, то последовательность повторится, почему это относится только к степеням 2? - Затем он говорит, что если n не является степенью 2, некоторые числа будут возвращаться в среднем чаще, чем другие. Почему это происходит, если
Random.nextInt()
генерирует случайные целые числа, которые равномерно распределены? (Он предоставляет фрагмент кода, который наглядно демонстрирует это, но я не понимаю, почему это так, и как это связано с тем, что n является степенью 2).