java-random-in-range、width = 300、height = 225

この記事では、ある範囲にランダムな整数を生成する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(包括的)からbound(排他的)までのランダムな整数を生成します。

1.1コードスニペット。 `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(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 5以上10以下の範囲の10個のランダムな整数を生成する完全な例。

TestRandom.java

package com.mkyong.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コードスニペット。 1.2を参照してください。多かれ少なかれ同じ式です。

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

2.2 16個以上20個以下の範囲で10個の乱数を生成する完全な例

TestRandom.java

package com.mkyong.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

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コードスニペット。

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

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

    }

3.2 33(包括的)と38(包括的)の範囲の10のランダムな整数を生成する完全な例。

TestRandom.java

package com.mkyong.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自己参照のための追加。

ストリームサイズが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

参考文献

JavaDoc]。

https://community.oracle.com/message/6596485

[Oracleフォーラム:ランダム

JavaScriptの乱数の重み付け]