Генерация случайного 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]](https://www.oreilly.com/library/view/effective-java-3rd/9780134686097/) — эталонный источник по Java, содержащий ценные советы и рекомендации.
- SplittableRandom (Java Platform SE 8 ) — официальная документация по
SplittableRandom
от JavaOraclepedia для генерации случайных чисел в Java.