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

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

java-random-integer-in-range

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

  1. java.util.Random.nextInt

  2. Math.random

  3. java.util.Random.ints (Java 8)

1. java.util.Random

ЭтотRandom().nextInt(int bound) генерирует случайное целое число от 0 (включительно) до связанного (исключительного).

1.1 Code snippet. ДляgetRandomNumberInRange(5, 10) это сгенерирует случайное целое число от 5 (включительно) до 10 (включительно).

    private static int getRandomNumberInRange(int min, int max) {

        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }

        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }

1.2 What is (max – min) + 1) + min?

Вышеупомянутая формула будет генерировать случайное целое число в диапазоне от min (включительно) до max (включительно).

    //Random().nextInt(int bound) = Random integer from 0 (inclusive) to bound (exclusive)

    //1. nextInt(range) = nextInt(max - min)
    new Random().nextInt(5);  // [0...4] [min = 0, max = 4]
    new Random().nextInt(6);  // [0...5]
    new Random().nextInt(7);  // [0...6]
    new Random().nextInt(8);  // [0...7]
    new Random().nextInt(9);  // [0...8]
    new Random().nextInt(10); // [0...9]
    new Random().nextInt(11); // [0...10]

    //2. To include the last value (max value) = (range + 1)
    new Random().nextInt(5 + 1)  // [0...5] [min = 0, max = 5]
    new Random().nextInt(6 + 1)  // [0...6]
    new Random().nextInt(7 + 1)  // [0...7]
    new Random().nextInt(8 + 1)  // [0...8]
    new Random().nextInt(9 + 1)  // [0...9]
    new Random().nextInt(10 + 1) // [0...10]
    new Random().nextInt(11 + 1) // [0...11]

    //3. To define a start value (min value) in a range,
    //   For example, the range should start from 10 = (range + 1) + min
    new Random().nextInt(5 + 1)  + 10 // [0...5]  + 10 = [10...15]
    new Random().nextInt(6 + 1)  + 10 // [0...6]  + 10 = [10...16]
    new Random().nextInt(7 + 1)  + 10 // [0...7]  + 10 = [10...17]
    new Random().nextInt(8 + 1)  + 10 // [0...8]  + 10 = [10...18]
    new Random().nextInt(9 + 1)  + 10 // [0...9]  + 10 = [10...19]
    new Random().nextInt(10 + 1) + 10 // [0...10] + 10 = [10...20]
    new Random().nextInt(11 + 1) + 10 // [0...11] + 10 = [10...21]

    // Range = (max - min)
    // So, the final formula is ((max - min) + 1) + min

    //4. Test [10...30]
    // min = 10 , max = 30, range = (max - min)
    new Random().nextInt((max - min) + 1) + min
    new Random().nextInt((30 - 10) + 1) + 10
    new Random().nextInt((20) + 1) + 10
    new Random().nextInt(21) + 10    //[0...20] + 10 = [10...30]

    //5. Test [15...99]
    // min = 15 , max = 99, range = (max - min)
    new Random().nextInt((max - min) + 1) + min
    new Random().nextInt((99 - 15) + 1) + 15
    new Random().nextInt((84) + 1) + 15
    new Random().nextInt(85) + 15    //[0...84] + 15 = [15...99]

    //Done, understand?

1.3 Full examples to generate 10 random integers in a range between 5 (inclusive) and 10 (inclusive).

TestRandom.java

package com.example.example.test;

import java.util.Random;

public class TestRandom {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomNumberInRange(5, 10));
        }

    }

    private static int getRandomNumberInRange(int min, int max) {

        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }

        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }

}

Выход.

7
6
10
8
9
5
7
10
8
5

2. Math.random

ЭтотMath.random() дает случайное двойное значение от 0,0 (включительно) до 1,0 (исключая).

2.1 Code snippet. Обратитесь к 1.2, более-менее это та же формула.

    (int)(Math.random() * ((max - min) + 1)) + min

2.2 Full examples to generate 10 random integers in a range between 16 (inclusive) and 20 (inclusive).

TestRandom.java

package com.example.example.test;

public class TestRandom {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomNumberInRange(16, 20));
        }

    }

    private static int getRandomNumberInRange(int min, int max) {

        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }

        return (int)(Math.random() * ((max - min) + 1)) + min;
    }

}

Выход.

17
16
20
19
20
20
20
17
20
16

Note
Random.nextInt(n) более эффективен, чемMath.random() * n, прочтите этоOracle forum post.

3. Java 8 Random.ints

В Java 8 новые методы добавляются вjava.util.Random

    public IntStream ints(int randomNumberOrigin, int randomNumberBound)
    public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)

ЭтотRandom.ints(int origin, int bound) илиRandom.ints(int min, int max) генерирует случайное целое число от источника (включительно) до связанного (исключительного).

3.1 Code snippet.

    private static int getRandomNumberInRange(int min, int max) {

        Random r = new Random();
        return r.ints(min, (max + 1)).findFirst().getAsInt();

    }

3.2 Full examples to generate 10 random integers in a range between 33 (inclusive) and 38 (inclusive).

TestRandom.java

package com.example.form.test;

import java.util.Random;

public class TestRandom {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomNumberInRange(33, 38));
        }

    }

    private static int getRandomNumberInRange(int min, int max) {

        Random r = new Random();
        return r.ints(min, (max + 1)).limit(1).findFirst().getAsInt();

    }

}

Выход.

34
35
37
33
38
37
34
35
36
37

3.3 Extra, for self-reference.

Создает случайные целые числа в диапазоне от 33 (включительно) до 38 (исключая) с размером потока 10. И распечатайте элементы сforEach.

    //Java 8 only
    new Random().ints(10, 33, 38).forEach(System.out::println);

Выход.

34
37
37
34
34
35
36
33
37
34