Генерация случайного long числа в диапазоне в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы получить случайное число типа long в диапазоне от [0, n), вы можете использовать ThreadLocalRandom.current().nextLong(n) в Java:

Java
Скопировать код
long randomLong = ThreadLocalRandom.current().nextLong(n);  // Получаем число, удовлетворяющее условиям 0 <= randomLong < n

Таким образом, вы генерируете случайное число от 0 (включительно) до n (невключительно).

Кинга Идем в IT: пошаговый план для смены профессии

Выбор подходящего инструмента

В многопоточном приложении: ThreadLocalRandom

Для лучшей производительности в многопоточных приложениях используйте ThreadLocalRandom. Этот класс также предоставляет возможность задать начальное и конечное значения диапазона:

Java
Скопировать код
long randomLongInRange = ThreadLocalRandom.current().nextLong(origin, bound);  // Начальное значение включается, конечное – нет

Этот код генерирует случайное число типа long, находящееся в диапазоне между origin (включительно) и bound (невключительно).

Для получения воспроизводимых последовательностей: SplittableRandom

Для генерации последовательностей случайных чисел, которые можно воспроизводить, используйте SplittableRandom:

Java
Скопировать код
SplittableRandom splittableRandom = new SplittableRandom(seed);   
long splitRandom = splittableRandom.nextLong(origin, bound);  // При одинаковом seed получаем ту же последовательность

С помощью seed вы можете воссоздать одну и ту же последовательность случайных чисел, что полезно для репродуцируемости результатов тестов.

Анализ альтернатив и предотвращение проблем

Традиционный метод: Math.random()

Если специальные инструменты недоступны, Math.random() всегда под рукой, несмотря на необходимость явного приведения типа:

Java
Скопировать код
long randomNumber = (long)(Math.random() * n);  // Используем проверенный метод

Проблемы при использовании операции взятия остатка от деления

Использование операции взятия остатка от деления привлекательно для контроля над случайным числом типа long, но это может привести к смещению:

Java
Скопировать код
long biasedRandomNumber = (randomLong() % n);  // Будьте осторожны с возможными проблемами равномерности распределения

Этот подход дает неравномерное распределение чисел, приводя к смещению. Чтобы обеспечить справедливое распределение, стоит избегать его.

Учёт частных случаев

Создавая свой метод генерации чисел или используя другие подходы, важно учесть все возможные сценарии. Не стоит забывать о случаях, когда n равно нулю, имеет отрицательное значение, или выходит за рамки стандартных пределов.

Визуализация

Представьте, что у вас есть галерея искусственных произведений. Каждое произведение имеет номер от 0 до n-1:

Markdown
Скопировать код
Галерея: 🖼️[0] 🖼️[1] 🖼️[2] ... 🖼️[n-1]

Чтобы выбрать случайный экспонат, мы используем случайность:

Java
Скопировать код
long randomNumber = (long)(Math.random() * n);  // 🎲 Бросаем кубик

Результат: случайно выбранное произведение из коллекции галереи!

Markdown
Скопировать код
Начало: 🖼️[0] ... Конец: 🖼️[n-1]
Бросок кубика: 🎲 => Выбранное произведение: 🖼️[x]

Так же непредсказуем, как исход каждого броска кубика, такова и природа случайности в данном контексте.

Дополнительные возможности с Apache Commons Lang

Простоту дорожат, но хочется ли вам что-то более изысканное? Возможно, вы захотите использовать RandomUtils из Apache Commons Lang:

Java
Скопировать код
long randomLong = RandomUtils.nextLong(lower, upper);  // И Java может предложить что-то особенное!

Пакет Apache commons предлагает генерацию случайных чисел со здаными нижним lower и верхним upper порогами при использовании метода RandomUtils.nextLong().

Принятие компромиссов

При выборе инструмента для генерации случайных чисел важно понимать, какую цену приходится за него заплатить. Если ThreadLocalRandom идеален для многопоточных сред, то SplittableRandom может улучшить производительность в однопоточном контексте. Проанализируйте возможности и требования, чтобы выбрать наиболее подходящий вариант генерации случайных чисел.

Полезные материалы

  1. Random (Java Platform SE 8 )JavaOraclepedia об классе Random.
  2. ThreadLocalRandom (Java Platform SE 8 ) — всё о ThreadLocalRandom, упрощённой версии Random.
  3. How do I generate random integers within a specific range in Java? – Stack Overflow — форум Stack Overflow на тему генерации случайных чисел в Java.
  4. Java Math random() Method – GeeksforGeeks — глубокое погружение в метод Math.random() от GeeksforGeeks.
  5. [Effective Java, 3rd Edition [Book]](https://www.oreilly.com/library/view/effective-java-3rd/9780134686097/) — эталонный источник по Java, содержащий ценные советы и рекомендации.
  6. SplittableRandom (Java Platform SE 8 )официальная документация по SplittableRandom от JavaOraclepedia для генерации случайных чисел в Java.