Java 乱数を生成するサンプル(SecureRandom)

Javaの乱数を生成するサンプルです。

目次

乱数を生成する

  • Randomクラスは、乱数を生成する機能を持ちますが生成される値に偏りがあるといわれます。またシード値がわかると値が予測できる可能性があります。
  • Mathクラスのrandomメソッドは、内部でRandomクラスを使用しています。
  • セキュリティ関連で使用する場合は、SecureRandomクラスを使用しましょう。
  • 以下は、JPCERT/CCのMSC02-J. 高品質の乱数を生成するのリンクです。
    https://www.jpcert.or.jp/java-rules/msc02-j.html
  • 以下はOracleのJava8 API仕様のSecureRandomクラスのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/security/SecureRandom.html

 

SecureRandomクラスのサンプル

public class SecureRandom extends Random

SecureRandomクラスのサンプルです。

package test1;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class Test1 {
	public static void main(String[] args) {
		SecureRandom sr1;
		try {
			sr1 = SecureRandom.getInstance("SHA1PRNG");
			
			// 引数なし
			System.out.println(sr1.nextInt()); //例:409928955

			// 0〜2の数値を生成
			System.out.println(sr1.nextInt(3));

			// 1〜3の数値を生成
			System.out.println(sr1.nextInt(3)+1);

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
}

9行目は、乱数を生成しています。getInstanceメソッドの引数の「SHA1PRNG」は、アルゴリズム名です。
その他のアルゴリズム名については、
以下のOracleの「SecureRandom乱数生成アルゴリズム」のリンクを参照願います。
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#SecureRandom

15行目は、nextIntメソッドで0から2の値をランダムに返します。
18行目は、nextIntメソッドで0から2の値をランダムに返します。

 

配列の値をランダムに表示する

上記のSecureRandomクラスを使用して配列の値をランダムに表示するサンプルです。

package test1;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class Test1 {
	public static void main(String[] args) {
		SecureRandom sr1;
		
		String[] a = {"赤","黄","青"};
		
		try {
			sr1 = SecureRandom.getInstance("SHA1PRNG");

			int b = sr1.nextInt(3);// 0〜2

			System.out.println(a[b]);

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
}

9行目は、配列です。
12行目は、乱数を生成しています。
14行目は、nextIntメソッドで0から2の値をランダムに返します。配列のインデックス値になります。
16行目は、配列の値をランダムに表示します。

 

(参考)Randomクラスのサンプル

public class Random extends Object implements Serializable

Randomクラスのサンプルです。

package test1;
import java.util.Random;

public class Test1 {
	public static void main(String[] args) {
				
	        Random r1 = new Random();
	        System.out.println(r1.nextInt()); //例:844725120

	        System.out.println(r1.nextInt(10)); //0〜9
	        System.out.println(r1.nextInt(9) + 1); //1~9
 	}
}

7行目は、乱数を生成しています。
10行目は、nextIntメソッドで0から9の値をランダムに返します。
11行目は、nextIntメソッドで1から9の値をランダムに返します。

以下はJava8 API仕様のRandomクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Random.html

(参考)Mathクラスのrandomメソッド

public static double random()

Mathクラスのrandomメソッドのサンプルです。

package test1;

public class Test1 {
	public static void main(String[] args) {
				
	        double r1 = Math.random();
	        System.out.println(r1); //例:0.38409010226988394

	        System.out.println((int)(Math.random()*10)); //0〜9
	        System.out.println((int)(Math.random()*9+1)); //1~9
 	}
}

6行目は、乱数を生成しています。
12行目は、randomメソッドで0から9の値をランダムに返します。
16行目は、randomメソッドで1から9の値をランダムに返します。

以下はJava8 API仕様のMathクラスのrandomメソッドのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Math.html#random--

関連の記事

Java べき乗を計算するサンプル(pow)
Java 小数第一位で切り上げるサンプル(ceil)
Java 小数第一位で切り捨てるサンプル(floor)
Java 小数第一位で四捨五入するサンプル(round)

△上に戻る