ジャヴァでのランダム数字生成器
今日は、Javaでランダムな数値を生成する方法について見ていきます。Javaのプログラムでランダムな数値を生成する必要があることがあります。例えば、サイコロのゲームや暗号化のためのランダムな鍵IDの生成などです。
Javaでの乱数生成器
-
- java.util.Randomクラスはランダムな数値を生成するために使用することができます。ランダムな整数、長整数、倍精度浮動小数点数などを生成するためのいくつかのメソッドを提供しています。
-
- Math.random()を使用することでも倍精度浮動小数点数を生成することができます。このメソッドは内部的にJava Randomクラスを使用しています。
-
- java.util.concurrent.ThreadLocalRandomクラスはマルチスレッド環境でのランダムな数値生成に使用するべきです。このクラスはJava Concurrentパッケージの一部であり、Java 1.7で導入されました。このクラスにはJava Randomクラスと似たメソッドがあります。
- java.security.SecureRandomは強力なセキュリティを持つランダムな数値を生成するために使用することができます。このクラスは暗号的に強力な乱数ジェネレータを提供しています。ただし、処理速度が遅いです。したがって、アプリケーションの要件に応じて使用するかどうかを判断する必要があります。
Javaの乱数生成器
いくつかの例を見て、Javaでランダムな数値を生成する方法を見てみましょう。その後、ThreadLocalRandomとSecureRandomの例プログラムも見ていきましょう。
1. ランダムな整数を生成する
Random random = new Random();
int rand = random.nextInt();
はい、Javaでランダムな整数を生成するのはそれほど簡単です。Randomインスタンスを作成すると、すべてのnextXXXメソッド呼び出しで使用される長いシード値が生成されます。このシード値をプログラムで設定することもできますが、ほとんどの場合、必要ありません。
//set the long seed value using Random constructor
Random random = new Random(123456789);
//set long seed value using setter method
Random random1 = new Random();
random1.setSeed(1234567890);
2. 1から10までのランダムな数をJavaで生成してください。
時々、私たちは範囲内のランダムな数字を生成する必要があります。例えば、サイコロのゲームでは可能な値は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. ランダムな倍精度浮動小数点数を生成する
私たちはJavaでランダムな浮動小数点数を生成するために、Math.random()やRandomクラスのnextDoubleメソッドを使用することができます。
Random random = new Random();
double d = random.nextDouble();
double d1 = Math.random();
4. ランダムな浮動小数点数を生成する
Random random = new Random();
float f = random.nextFloat();
5. ランダムな長さを生成する
Random random = new Random();
long l = random.nextLong();
6. ランダムなブール値を生成する。
Random random = new Random();
boolean flag = random.nextBoolean();
7. ランダムなバイト配列を生成する
ランダムクラスを使用して、ランダムバイトを生成し、それをユーザーが指定したバイト配列に配置することができます。生成されるランダムバイトの数は、バイト配列の長さと同じです。
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.scdev.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 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リポジトリから、サンプルコードをダウンロードすることができます。