Java – 範囲内の乱数を生成する
この記事では、ある範囲にランダムな整数を生成する3つの方法を示します。
-
java.util.Random.nextInt
-
Math.random
-
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]。
http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html
[java.lang.Math
JavaDoc]。
https://community.oracle.com/message/6596485
[Oracleフォーラム:ランダム
番号生成]。
http://www.javascriptkit.com/javatutors/weighrandom.shtml
[Generating
JavaScriptの乱数の重み付け]