Генерация случайного long числа в диапазоне в Java
Быстрый ответ
Чтобы получить случайное число типа long в диапазоне от [0, n), вы можете использовать ThreadLocalRandom.current().nextLong(n) в Java:
long randomLong = ThreadLocalRandom.current().nextLong(n); // Получаем число, удовлетворяющее условиям 0 <= randomLong < n
Таким образом, вы генерируете случайное число от 0 (включительно) до n (невключительно).

Выбор подходящего инструмента
В многопоточном приложении: ThreadLocalRandom
Для лучшей производительности в многопоточных приложениях используйте ThreadLocalRandom. Этот класс также предоставляет возможность задать начальное и конечное значения диапазона:
long randomLongInRange = ThreadLocalRandom.current().nextLong(origin, bound); // Начальное значение включается, конечное – нет
Этот код генерирует случайное число типа long, находящееся в диапазоне между origin (включительно) и bound (невключительно).
Для получения воспроизводимых последовательностей: SplittableRandom
Для генерации последовательностей случайных чисел, которые можно воспроизводить, используйте SplittableRandom:
SplittableRandom splittableRandom = new SplittableRandom(seed);
long splitRandom = splittableRandom.nextLong(origin, bound); // При одинаковом seed получаем ту же последовательность
С помощью seed вы можете воссоздать одну и ту же последовательность случайных чисел, что полезно для репродуцируемости результатов тестов.
Анализ альтернатив и предотвращение проблем
Традиционный метод: Math.random()
Если специальные инструменты недоступны, Math.random() всегда под рукой, несмотря на необходимость явного приведения типа:
long randomNumber = (long)(Math.random() * n); // Используем проверенный метод
Проблемы при использовании операции взятия остатка от деления
Использование операции взятия остатка от деления привлекательно для контроля над случайным числом типа long, но это может привести к смещению:
long biasedRandomNumber = (randomLong() % n); // Будьте осторожны с возможными проблемами равномерности распределения
Этот подход дает неравномерное распределение чисел, приводя к смещению. Чтобы обеспечить справедливое распределение, стоит избегать его.
Учёт частных случаев
Создавая свой метод генерации чисел или используя другие подходы, важно учесть все возможные сценарии. Не стоит забывать о случаях, когда n равно нулю, имеет отрицательное значение, или выходит за рамки стандартных пределов.
Визуализация
Представьте, что у вас есть галерея искусственных произведений. Каждое произведение имеет номер от 0 до n-1:
Галерея: 🖼️[0] 🖼️[1] 🖼️[2] ... 🖼️[n-1]
Чтобы выбрать случайный экспонат, мы используем случайность:
long randomNumber = (long)(Math.random() * n); // 🎲 Бросаем кубик
Результат: случайно выбранное произведение из коллекции галереи!
Начало: 🖼️[0] ... Конец: 🖼️[n-1]
Бросок кубика: 🎲 => Выбранное произведение: 🖼️[x]
Так же непредсказуем, как исход каждого броска кубика, такова и природа случайности в данном контексте.
Дополнительные возможности с Apache Commons Lang
Простоту дорожат, но хочется ли вам что-то более изысканное? Возможно, вы захотите использовать RandomUtils из Apache Commons Lang:
long randomLong = RandomUtils.nextLong(lower, upper); // И Java может предложить что-то особенное!
Пакет Apache commons предлагает генерацию случайных чисел со здаными нижним lower и верхним upper порогами при использовании метода RandomUtils.nextLong().
Принятие компромиссов
При выборе инструмента для генерации случайных чисел важно понимать, какую цену приходится за него заплатить. Если ThreadLocalRandom идеален для многопоточных сред, то SplittableRandom может улучшить производительность в однопоточном контексте. Проанализируйте возможности и требования, чтобы выбрать наиболее подходящий вариант генерации случайных чисел.
Полезные материалы
- Random (Java Platform SE 8 ) — JavaOraclepedia об классе
Random. - ThreadLocalRandom (Java Platform SE 8 ) — всё о
ThreadLocalRandom, упрощённой версииRandom. - How do I generate random integers within a specific range in Java? – Stack Overflow — форум Stack Overflow на тему генерации случайных чисел в Java.
- Java Math random() Method – GeeksforGeeks — глубокое погружение в метод
Math.random()от GeeksforGeeks. - Effective Java, 3rd Edition [Book] — эталонный источник по Java, содержащий ценные советы и рекомендации.
- SplittableRandom (Java Platform SE 8 ) — официальная документация по
SplittableRandomот JavaOraclepedia для генерации случайных чисел в Java.


