Java - 範囲内の乱数を生成する

Java –範囲内のランダムな整数を生成します

java-random-integer-in-range

この記事では、ある範囲でランダムな整数を生成する3つの方法を紹介します。

  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(排他的)までのランダムなdoubleを与えます。

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.

ストリームサイズ10で、33(包括的)から38(包括的)の範囲のランダムな整数を生成します。 そして、forEachでアイテムを印刷します。

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

出力。

34
37
37
34
34
35
36
33
37
34