Как генерировать случайные целые числа в определенном диапазоне в 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 ]

3 голосов
/ 25 февраля 2018

Допустим, вы хотите диапазон от 0 до 9, 0 - минимум, а 9 - максимум. Приведенная ниже функция будет печатать что угодно в диапазоне от 0 до 9. Она одинакова для всех диапазонов.

public static void main(String[] args) {
    int b = randomNumberRange(0, 9);
    int d = randomNumberRange (100, 200);
    System.out.println("value of b is " + b);
    System.out.println("value of d is " + d);
}

public static int randomNumberRange(int min, int max) {
    int n = (max + 1 - min) + min;
    return (int) (Math.random() * n);
}
3 голосов
/ 23 мая 2018

Ниже приведен еще один пример использования Random и forEach

.
int firstNum = 20;//Inclusive
int lastNum = 50;//Exclusive
int streamSize = 10;
Random num = new Random().ints(10, 20, 50).forEach(System.out::println);
3 голосов
/ 01 февраля 2018

Приведенный ниже код генерирует случайное число от 100 000 до 900 000. Этот код будет генерировать шестизначные значения. Я использую этот код для генерации шестизначного OTP .

Используйте import java.util.Random, чтобы использовать этот случайный метод.

import java.util.Random;

// Six digits random number generation for OTP
Random rnd = new Random();
long longregisterOTP = 100000 + rnd.nextInt(900000);
System.out.println(longregisterOTP);
2 голосов
/ 17 ноября 2018

Используйте java.util для Random для общего использования.

Вы можете определить минимальный и максимальный диапазон для получения этих результатов.

Random rand=new Random();
rand.nextInt((max+1) - min) + min;
2 голосов
/ 22 августа 2018
public static void main(String[] args) {

    Random ran = new Random();

    int min, max;
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter min range:");
    min = sc.nextInt();
    System.out.println("Enter max range:");
    max = sc.nextInt();
    int num = ran.nextInt(min);
    int num1 = ran.nextInt(max);
    System.out.println("Random Number between given range is " + num1);

}
2 голосов
/ 07 июня 2013

Попробуйте использовать org.apache.commons.lang.RandomStringUtils класс. Да, иногда это дает повторяющееся число рядом, но оно будет давать значение от 5 до 15:

    while (true)
    {
        int abc = Integer.valueOf(RandomStringUtils.randomNumeric(1));
        int cd = Integer.valueOf(RandomStringUtils.randomNumeric(2));
        if ((cd-abc) >= 5 && (cd-abc) <= 15)
        {
            System.out.println(cd-abc);
            break;
        }
    }
2 голосов
/ 29 октября 2015

Случайное число из диапазона [min..max] включительно:

int randomFromMinToMaxInclusive = ThreadLocalRandom.current()
        .nextInt(min, max + 1);
2 голосов
/ 29 ноября 2016

Большинство из вышеприведенных предложений не учитывают «переполнение», например: min = Integer.MIN_VALUE, max = 100. Один из правильных подходов, которые у меня пока есть, это:

final long mod = max- min + 1L;
final int next = (int) (Math.abs(rand.nextLong() % mod) + min);
2 голосов
/ 02 декабря 2017

В https://sourceforge.net/projects/stochunit/ имеется библиотека для обработки выбора диапазонов.

StochIntegerSelector randomIntegerSelector = new StochIntegerSelector();
randomIntegerSelector.setMin(-1);
randomIntegerSelector.setMax(1);
Integer selectInteger = randomIntegerSelector.selectInteger();

Имеет краевое включение / исключение.

2 голосов
/ 04 октября 2017

Простой способ генерировать n случайных чисел между a и b например, a = 90, b = 100, n = 20

Random r = new Random();
for(int i =0; i<20; i++){
    System.out.println(r.ints(90, 100).iterator().nextInt());
}

r.ints() возвращает IntStream и имеет несколько полезных методов, взгляните на его API .

...