Javaランダム

JavaのRandomクラスは、一連のランダムな数値を生成するために使用されます。

Java Randomクラス

  • Randomクラスは、java.utilパッケージの一部です。
  • JavaのRandomクラスのインスタンスは、ランダムな数値を生成するために使用されます。
  • このクラスは、整数、倍精度浮動小数点数、長整数、単精度浮動小数点数などのランダムな数値を生成するためのいくつかのメソッドを提供しています。
  • ランダムな数値生成アルゴリズムは、シード値上で動作します。シード値が指定されていない場合、システムのナノ秒からシード値が作成されます。
  • 2つのRandomインスタンスが同じシード値を持っている場合、それらは同じランダム数列を生成します。
  • JavaのRandomクラスはスレッドセーフですが、マルチスレッド環境ではjava.util.concurrent.ThreadLocalRandomクラスを使用することが推奨されます。
  • Randomクラスのインスタンスは、セキュリティに敏感なアプリケーションには適しておらず、その場合はjava.security.SecureRandomを使用することが望ましいです。

JavaのRandomコンストラクタ

JavaのRandomクラスには、以下に示す2つのコンストラクタがあります:

  1. Random():新しいランダムジェネレータを作成します
  2. Random(long seed):指定されたシードを使用して新しいランダムジェネレータを作成します

Java Random Class Methods

JavaのRandomクラスのいくつかのメソッドを見てみましょう。

  1. nextBoolean(): このメソッドは、乱数ジェネレータシーケンスからの次の擬似乱数であるブール値を返します。
  2. nextDouble(): このメソッドは、0.0から1.0の間の次の擬似乱数であるdouble値を返します。
  3. nextFloat(): このメソッドは、0.0から1.0の間の次の擬似乱数であるfloat値を返します。
  4. nextInt(): このメソッドは、乱数ジェネレータシーケンスからの次のint値を返します。
  5. nextInt(int n): このメソッドは、乱数ジェネレータシーケンスから指定された値の範囲内のint値を返します。

Java Random Example

以下に、JavaのRandom例題プログラムを見てみましょう。

package com.journaldev.examples;

import java.util.Random;

/**
 * Java Random Number Example Program
 * 
 */
public class RandomNumberExample {

	public static void main(String[] args) {
		
		//乱数ジェネレータを初期化
		Random random = new Random();
		
		//ブール値を生成
		System.out.println(random.nextBoolean());
		
		//double値を生成
		System.out.println(random.nextDouble());
		
		//float値を生成
		System.out.println(random.nextFloat());
		
		//int値を生成
		System.out.println(random.nextInt());
		
		//int値を生成 within specific limit
		System.out.println(random.nextInt(20));

	}

}

上記プログラムの出力は:

false
0.30986869120562854
0.6210066
-1348425743
18

この投稿の詳細については、Javaランダム数生成を参照してください。

シードを使用したランダム数の生成

シードを使用してランダム数を生成する方法は2つあります。

Random random = new Random(long seed);
                         
Random random1 = new Random();
random1.setSeed(seed);

シードは、メソッドnext(int)によって維持される疑似乱数生成器の内部状態の初期値です。

package com.journaldev.examples;

import java.util.Random;

/**
 * Java Random Number Using Seed Example Program
 * 
 * @author pankaj
 *
 */
public class RadomSeedExample {

	public static void main(String[] args) {
		
		//コンストラクタを使用する
		Random random = new Random(100);
		System.out.println("Using Constructor");
		System.out.println(random.nextInt());
		
		//メソッドを使用する
		Random random2 = new Random();
		random2.setSeed(200);
		System.out.println("Using Method");
		System.out.println(random2.nextInt());
	}
}

上記のプログラムの出力は次のとおりです:

Using Constructor
-1193959466
Using Method
-1133938638

異なるランダム数生成器に同じシードを渡した場合はどうなるでしょうか?以下のプログラムを見て、異なるランダム数生成器に同じシードを渡した場合に何が起こるかを見てみましょう。

package com.journaldev.examples;

import java.util.Random;

/**
 * Java Random Number Using Same Seed Example Program
 * 
 */
public class RandomNumberSameSeedExample {

	public static void main(String[] args) {
		
		//同じシードを使用して2つのランダム数生成器を初期化する
		Random random1 = new Random(100);
		Random random2 = new Random(100);
		
		System.out.println(random1.nextInt());
		System.out.println(random2.nextInt());

	}

}

上記のプログラムの出力は次のとおりです:

-1193959466
-1193959466

異なるランダム数生成器に同じシードを渡すと、同じランダム数が生成されることがわかります。

Java 8ランダムクラスのメソッド

上記の画像からわかるように、Java 8にはRandomクラスに多くの新しいメソッドが追加されています。これらのメソッドはランダムな数値のストリームを生成できます。以下は、1から100の範囲で5つの整数のストリームを生成する簡単なプログラムです。

package com.journaldev.random;

import java.util.Random;
import java.util.stream.IntStream;

public class JavaRandomExample {

	public static void main(String[] args) {

		Random random = new Random();

		// 1から100の範囲で5つの整数のストリームを生成
		IntStream ints = random.ints(5, 1, 100);

		ints.forEach(System.out::println);
	}

}

これで、Java Randomクラスに関する簡単なまとめです。参照: APIドキュメント

Source:
https://www.digitalocean.com/community/tutorials/java-random