Java での乱数生成器

今日は、Javaでランダムな数字を生成する方法を見てみましょう。Javaプログラムでは、ランダムな数字を生成する必要があることがあります。例えば、サイコロのゲームや暗号化のためのランダムなキーIDの生成などです。

Javaにおけるランダム数生成器

Javaでは、ランダムな数字を生成するためのさまざまな方法があります。

  1. java.util.Randomクラスを使用してランダムな数値を作成することができます。このクラスは、ランダムな整数、ロング、ダブルなどを生成するためのいくつかのメソッドを提供しています。
  2. Math.random()を使用してダブルを生成することもできます。このメソッドは、内部的にJavaのRandomクラスを使用しています。
  3. java.util.concurrent.ThreadLocalRandomクラスは、マルチスレッド環境でランダムな数値を生成するために使用する必要があります。このクラスは、JavaのConcurrentパッケージの一部であり、Java 1.7で導入されました。このクラスには、JavaのRandomクラスと似たメソッドがあります。
  4. java.security.SecureRandomは、強力なセキュリティを持つランダムな数値を生成するために使用することができます。このクラスは、暗号的に強力なランダム数生成器を提供します。ただし、処理が遅いです。そのため、アプリケーションの要件に応じて使用するかどうかを決定する必要があります。

Javaランダム数生成

Javaでランダムな数を生成するいくつかの例を見てみましょう。後で、ThreadLocalRandomとSecureRandomの例プログラムも見てみます。

1. ランダムな整数を生成する

Random random = new Random();

int rand = random.nextInt();

はい、Javaでランダムな整数を生成するのはそれほど簡単です。Randomインスタンスを作成すると、nextXXXメソッド呼び出しで使用される長いシード値が生成されます。このシード値をプログラムで設定することもできますが、ほとんどの場合は必要ありません。

// Randomコンストラクタを使用して長いシード値を設定する
Random random = new Random(123456789);

// setterメソッドを使用して長いシード値を設定する
Random random1 = new Random();
random1.setSeed(1234567890);

2. 1から10までのランダムな数を生成する

時には、範囲内でランダムな数を生成する必要があります。たとえば、サイコロのゲームでは値は1から6までのみです。以下は、1から10までのランダムな数を生成する方法を示すコードです。

Random random = new Random();
int rand = 0;
while (true){
    rand = random.nextInt(11);
    if(rand !=0) break;
}
System.out.println(rand);

nextInt(int x)の引数は除外されるため、引数として11を指定する必要があります。また、生成されるランダムな数には0が含まれるため、1から10の値が得られるまでnextIntメソッドを繰り返し呼び出す必要があります。上記のコードを任意の範囲内でランダムな数を生成するために拡張することができます。

3. ランダムなdouble数の生成

Javaでは、Math.random()またはRandomクラスのnextDoubleメソッドを使用して、ランダムなdouble数を生成することができます。

Random random = new Random();

double d = random.nextDouble();

double d1 = Math.random();

4. ランダムなfloat数の生成

Random random = new Random();

float f = random.nextFloat();

5. ランダムなlong数の生成

Random random = new Random();

long l = random.nextLong();

6. ランダムなbooleanの生成

Random random = new Random();

boolean flag = random.nextBoolean();

7. ランダムなバイト配列を生成する

Randomクラスを使用して、ランダムなバイトを生成し、ユーザーが指定したバイト配列に配置することができます。生成されるランダムバイトの数は、バイト配列の長さと等しいです。

Random random = new Random();

byte[] randomByteArray = new byte[5];

random.nextBytes(randomByteArray);

System.out.println(Arrays.toString(randomByteArray)); // sample output [-70, -57, 74, 99, -78]

8. マルチスレッド環境でのThreadLocalRandomの使用

以下は、マルチスレッド環境でThreadLocalRandomを使用する簡単な例です。

package com.journaldev.randomnumber;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {

	public static void main(String[] args) {
		Runnable runnable = new MyRunnable();

		for (int i = 0; i < 5; i++) {
			Thread t = new Thread(runnable);
			t.setName("MyRunnable-Thread-" + i);
			t.start();
		}
	}

}

class MyRunnable implements Runnable {

	@Override
	public void run() {
		String threadName = Thread.currentThread().getName();
		System.out.println(threadName + "::" + ThreadLocalRandom.current().nextInt());
	}

}

以下は、上記プログラムの実行のサンプル出力です。

MyRunnable-Thread-0::-1744088963
MyRunnable-Thread-3::139405798
MyRunnable-Thread-1::1403710182
MyRunnable-Thread-2::-1222080205
MyRunnable-Thread-4::-185825276

ThreadLocalRandomインスタンスのシード値を設定することはできず、UnsupportedOperationExceptionがスローされます。ThreadLocalRandomクラスには、範囲内のランダムな数値を生成するためのいくつかの便利なメソッドもあります。たとえば、1から10のランダムな数値を生成するには、以下のようにします。

ThreadLocalRandom random = ThreadLocalRandom.current();
		
int rand = random.nextInt(1, 11);

ThreadLocalRandomクラスには、ランダムなlong値とdouble値を生成するための類似のメソッドもあります。

9. SecureRandomの例

SecureRandomクラスを使用して、リストされたプロバイダのいずれかを使用して、より安全なランダムな数値を生成することができます。以下に、簡単なSecureRandomの例コードが示されています。

Random random = new SecureRandom();

int rand = random.nextInt();

System.out.println(rand);

これで、Javaプログラムでランダムな数値を生成する方法について説明しました。

例コードは、GitHubリポジトリからダウンロードできます。

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