Looking for java Keywords? Try Ask4Keywords

Java Language Псевдо случайные числа в определенном диапазоне


пример

Метод nextInt(int bound) Random принимает верхнюю эксклюзивную границу, то есть число, которое возвращаемое случайное значение должно быть меньше. Однако только метод nextInt принимает nextInt ; nextLong , nextDouble и т.п. нет.

Random random = new Random();
random.nextInt(1000); // 0 - 999

int number = 10 + random.nextInt(100); // number is in the range of 10 to 109

Начиная с Java 1.7, вы также можете использовать ThreadLocalRandom ( источник ). Этот класс обеспечивает поточно-безопасный PRNG (генератор псевдослучайных чисел). Обратите внимание, что метод nextInt этого класса принимает как верхнюю, так и нижнюю границу.

import java.util.concurrent.ThreadLocalRandom;

// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
ThreadLocalRandom.current().nextInt(min, max + 1);

Обратите внимание, что в официальной документации указано, что nextInt(int bound) может делать странные вещи, когда bound около 2 30 +1 (выделено курсивом):

Алгоритм немного сложный. Он отклоняет значения, которые приведут к неравномерному распределению (из-за того, что 2 ^ 31 не делится на n). Вероятность отклонения значения зависит от n. Наихудший случай равен n = 2 ^ 30 + 1, для которого вероятность отклонения равна 1/2, а ожидаемое число итераций до окончания цикла равно 2.

Другими словами, указание границы (немного) уменьшит производительность метода nextInt , и это снижение производительности станет более выраженным, так как bound приближается к половине максимального значения int.