Как генерировать случайные целые числа в определенном диапазоне в Java? - PullRequest
3225 голосов
/ 12 декабря 2008

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

Я пробовал следующее, но они не работают:

Попытка 1:

randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.

Попытка 2:

Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum =  minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.

Ответы [ 64 ]

33 голосов
/ 12 декабря 2008

Интересно, подходит ли какой-либо из методов генерации случайных чисел, предоставляемых библиотекой Apache Commons Math .

Например: RandomDataGenerator.nextInt или RandomDataGenerator.nextLong

31 голосов
/ 01 сентября 2013

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

Randomizer.generate(0,10); //min of zero, max of ten

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

Randomizer.java

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

Это просто чисто и просто.

30 голосов
/ 03 августа 2014

Давайте рассмотрим пример.

Предположим, я хочу сгенерировать число от 5-10 :

int max = 10;
int min = 5;
int diff = max - min;
Random rn = new Random();
int i = rn.nextInt(diff + 1);
i += min;
System.out.print("The Random Number is " + i);

Дайте нам понять это ...

Инициализировать max с самым высоким значением и min с самым низким значением.

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

5, 6, 7, 8, 9, 10

Таким образом, отсчет будет max - min + 1.

т.е. 10 - 5 + 1 = 6

Случайное число будет генерировать число в диапазоне 0-5 .

т.е. 0, 1, 2, 3, 4, 5

Добавление значения min к случайному числу приведет к:

5, 6, 7, 8, 9, 10

Отсюда получаем желаемый диапазон.

27 голосов
/ 12 декабря 2008
 rand.nextInt((max+1) - min) + min;
22 голосов
/ 27 мая 2015

Создайте случайное число для разницы min и max с помощью метода nextint (n) , а затем добавьте к результату число min:

Random rn = new Random();
int result = rn.nextInt(max - min + 1) + min;
System.out.println(result);
21 голосов
/ 12 апреля 2018

Начиная с Java 7, вы больше не должны использовать Random. Для большинства применений генератор случайных чисел выбора сейчас ThreadLocalRandom.

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

Джошуа Блох. Эффективная Java. Третье издание.

Начиная с Java 8

Для пулов объединений и параллельных потоков используйте SplittableRandom, который обычно быстрее, обладает лучшими свойствами статистической независимости и однородности по сравнению с Random.

Для генерации случайного int в диапазоне [0, 1_000]:

int n = new SplittableRandom().nextInt(0, 1_001);

Для генерации случайного int[100] массива значений в диапазоне [0, 1_000]:

int[] a = new SplittableRandom().ints(100, 0, 1_001).parallel().toArray();

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

IntStream stream = new SplittableRandom().ints(100, 0, 1_001);
19 голосов
/ 02 ноября 2017

Чтобы сгенерировать случайное число «между двумя числами», используйте следующий код:

Random r = new Random();
int lowerBound = 1;
int upperBound = 11;
int result = r.nextInt(upperBound-lowerBound) + lowerBound;

Это дает вам случайное число от 1 (включительно) до 11 (исключение), поэтому инициализируйте значение upperBound, добавив 1. Например, если вы хотите сгенерировать случайное число от 1 до 10, инициализируйте число upperBound 11 вместо 10.

19 голосов
/ 12 августа 2012

Этот метод может быть удобным для использования:

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

public static int getRandomNumberBetween(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt(max - min) + min;
    if (randomNumber == min) {
        // Since the random number is between the min and max values, simply add 1
        return min + 1;
    } else {
        return randomNumber;
    }
}

и этот метод возвращает случайное число из предоставленного минимального и максимального значения (поэтому сгенерированное число также может быть минимальным или максимальным числом):

public static int getRandomNumberFrom(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt((max + 1) - min) + min;

    return randomNumber;
}
19 голосов
/ 15 февраля 2012

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

import java.util.Random;

public class RandomRange extends Random {
    public int nextIncInc(int min, int max) {
        return nextInt(max - min + 1) + min;
    }

    public int nextExcInc(int min, int max) {
        return nextInt(max - min) + 1 + min;
    }

    public int nextExcExc(int min, int max) {
        return nextInt(max - min - 1) + 1 + min;
    }

    public int nextIncExc(int min, int max) {
        return nextInt(max - min) + min;
    }
}
19 голосов
/ 16 февраля 2010

В случае броска кубика это будет случайное число от 1 до 6 (не от 0 до 6), поэтому:

face = 1 + randomNumbers.nextInt(6);
...