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

12 голосов
/ 11 февраля 2015
private static Random random = new Random();    

public static int getRandomInt(int min, int max){
  return random.nextInt(max - min + 1) + min;
}

OR

public static int getRandomInt(Random random, int min, int max)
{
  return random.nextInt(max - min + 1) + min;
}
9 голосов
/ 28 мая 2017

Я использую это:

 /**
   * @param min - The minimum.
   * @param max - The maximum.
   * @return A random double between these numbers (inclusive the minimum and maximum).
   */
 public static double getRandom(double min, double max) {
   return (Math.random() * (max+1-min)) + min;
 }

Вы можете привести его к целому числу, если хотите.

8 голосов
/ 14 июня 2014
import java.util.Random; 

public class RandomUtil {
    // Declare as class variable so that it is not re-seeded every call
    private static Random random = new Random();

    /**
     * Returns a psuedo-random number between min and max (both inclusive)
     * @param min Minimim value
     * @param max Maximim value. Must be greater than min.
     * @return Integer between min and max (both inclusive)
     * @see java.util.Random#nextInt(int)
     */
    public static int nextInt(int min, int max) {
        // nextInt is normally exclusive of the top value,
        // so add 1 to make it inclusive
        return random.nextInt((max - min) + 1) + min;
    }
}
7 голосов
/ 27 октября 2012

Вы можете использовать этот фрагмент кода, который решит вашу проблему:

Random r = new Random();
int myRandomNumber = 0;
myRandomNumber = r.nextInt(maxValue-minValue+1)+minValue;

Используйте myRandomNumber (который даст вам номер в диапазоне).

7 голосов
/ 08 апреля 2015

Вы можете сделать что-то вроде этого:

import java.awt.*;
import java.io.*;
import java.util.*;
import java.math.*;

public class Test {

    public static void main(String[] args) {
        int first, second;

        Scanner myScanner = new Scanner(System.in);

        System.out.println("Enter first integer: ");
        int numOne;
        numOne = myScanner.nextInt();
        System.out.println("You have keyed in " + numOne);

        System.out.println("Enter second integer: ");
        int numTwo;
        numTwo = myScanner.nextInt();
        System.out.println("You have keyed in " + numTwo);

        Random generator = new Random();
        int num = (int)(Math.random()*numTwo);
        System.out.println("Random number: " + ((num>numOne)?num:numOne+num));
    }
}
6 голосов
/ 22 декабря 2016

Другой подход с использованием Java 8 IntStream и Collections.shuffle

import java.util.stream.IntStream;
import java.util.ArrayList;
import java.util.Collections;

public class Main {

    public static void main(String[] args) {

        IntStream range = IntStream.rangeClosed(5,10);
        ArrayList<Integer> ls =  new ArrayList<Integer>();

        //populate the ArrayList
        range.forEach(i -> ls.add(new Integer(i)) );

        //perform a random shuffle  using the Collections Fisher-Yates shuffle
        Collections.shuffle(ls);
        System.out.println(ls);
    }
}

Эквивалент в Scala

import scala.util.Random

object RandomRange extends App{
  val x =  Random.shuffle(5 to 10)
    println(x)
}
6 голосов
/ 15 января 2014

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

Решение 1:

randomNum = minimum + (int)(Math.random()*maximum); 

Проблема: randomNum присваиваются значения чисел, превышающие максимальные.

Объяснение: Предположим, что наш минимум равен 5, а ваш максимум равен 10. Любое значение от Math.random() больше 0,6 заставит выражение оценить значение 6 или больше, а добавление 5 сделает его больше 10 (ваш максимум). Проблема в том, что вы умножаете случайное число на максимум (который генерирует число, почти равное максимуму), а затем добавляете минимум. Если минимум не равен 1, это не правильно. Вы должны переключиться на, как указано в других ответах

randomNum = minimum + (int)(Math.random()*(maximum-minimum+1))

+1 означает, что Math.random() никогда не вернет 1.0.

Решение 2:

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

Ваша проблема в том, что «%» может возвращать отрицательное число, если первый член меньше 0. Поскольку rn.nextInt() возвращает отрицательные значения с вероятностью ~ 50%, вы также не получите ожидаемый результат.

Это, однако, было почти идеально. Вам просто нужно было посмотреть немного дальше вниз по Javadoc, nextInt (int n) . С помощью этого метода, делая

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

Также вернет желаемый результат.

5 голосов
/ 09 октября 2017
Random random = new Random();
int max = 10;
int min = 3;
int randomNum = random.nextInt(max) % (max - min + 1) + min;
5 голосов
/ 02 декабря 2016

Вы можете использовать

RandomStringUtils.randomNumeric(int count)

метод также из Apache Commons.

4 голосов
/ 14 августа 2018

Внесение следующих изменений в Попытка 1 должна выполнить работу -

randomNum = minimum + (int)(Math.random() * (maximum - minimum) );

Проверьте это для рабочего кода.

...