В примере Josh дает ошибочный случайный метод, который генерирует положительное случайное число с заданной верхней границей n
. Я не понимаю двух недостатки, которые он заявляет.Эффективная Java-статья 47: Знание и использование ваших библиотек. Пример ошибочного случайного целочисленного метода
Метод из книги:
private static final Random rnd = new Random();
//Common but deeply flawed
static int random(int n) {
return Math.abs(rnd.nextInt()) % 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()
генерирует случайные целые числа, которые равномерно распределены? (Он предоставляет фрагмент кода, который наглядно демонстрирует это, но я не понимаю, почему это так, и как это связано с тем, что n является степенью 2).
Зачем использовать этот метод? 'RND.nextInt (n) ' –
@Elliott Вот в чем смысл примера в книге. – Kevin
Я удивлен, что автор упустил самый большой недостаток: этот код иногда возвращает отрицательные числа! –