41

Как сгенерировать случайные целые числа в определенном диапазоне на Java?

12

Как сгенерировать случайное значение типа int в заданном диапазоне?

Я столкнулся с проблемой при попытке сгенерировать случайное целое число в определенном диапазоне. У меня есть несколько методов реализации, но они содержат ошибки, связанные с переполнением целого числа.

Вот один из методов:

randomNum = minimum + (int)(Math.random() * maximum);
// Ошибка: `randomNum` может быть больше `maximum`.

И еще один метод:

Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Ошибка: `randomNum` может быть меньше `minimum`.

Как правильно реализовать генерацию случайного числа, чтобы избежать этих проблем и гарантировать, что результат будет в нужном диапазоне? Буду благодарен за любые рекомендации или исправления!

5 ответ(ов)

4

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

Random ran = new Random();
int x = ran.nextInt(6) + 5;

В этом коде переменная x будет содержать случайное целое число, которое может принимать значения от 5 до 10 включительно. Метод nextInt(6) генерирует случайное число от 0 до 5, и, добавляя 5, вы сдвигаете диапазон значений к 5-10. Таким образом, возможные результаты для x — это 5, 6, 7, 8, 9 и 10.

2

В вашем случае, чтобы получить случайное значение в заданном диапазоне [minValue, maxValue], вы можете использовать следующий код на Java:

int randomValue = minValue + rn.nextInt(maxValue - minValue + 1);

Здесь rn - это экземпляр генератора случайных чисел, например, Random. Этот код работает следующим образом:

  1. rn.nextInt(maxValue - minValue + 1) генерирует случайное целое число от 0 до maxValue - minValue (включительно).
  2. Затем к этому случайному значению прибавляется minValue, чтобы сместить диапазон на нужные точки.

Таким образом, вы получите равновероятное целое число в диапазоне от minValue до maxValue.

1

Вы можете отредактировать свой второй код следующим образом:

Random rn = new Random();
int range = maximum - minimum + 1;
int randomNum = rn.nextInt(range) + minimum;

Этот код создаст случайное число в заданном диапазоне от minimum до maximum.

1

В Java существует класс ThreadLocalRandom, который является эквивалентом java.util.Random в многопоточной среде. Использование ThreadLocalRandom позволяет генерировать случайные числа локально для каждого потока, что значительно улучшает производительность за счёт уменьшения конфликтов между потоками.

Пример использования ThreadLocalRandom для генерации случайного числа в заданном интервале:

int rand = ThreadLocalRandom.current().nextInt(x, y);

Здесь x и y — это границы интервала, например, (1,10) для генерации случайного числа от 1 до 9.

Этот подход особенно полезен в многопоточных приложениях, где использование общего экземпляра java.util.Random может привести к блокировкам и снижению производительности из-за конкурирующих потоков.

0

Это можно сделать, просто вызвав следующий метод:

Randomizer.generate(0, 10); // Минимум 0 и максимум 10

Ниже приведен его исходный код.

Файл Randomizer.java

public class Randomizer {
    public static int generate(int min, int max) {
        return min + (int)(Math.random() * ((max - min) + 1));
    }
}

На мой взгляд, это просто и понятно.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь