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

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

確認環境
・Java 8

目次

乱数を生成する

乱数を生成するRandomクラスとMathクラスのrandomメソッド(※)は、生成される値に偏りがあるといわれ、またシード値がわかると、値が予測できる可能性があります。
※内部でRandomクラスを使用しています。

セキュリティ関連で使用する場合は、SecureRandomクラスを使用しましょう。

以下は、JPCERT/CCのMSC02-J. 高品質の乱数を生成するのリンクです。
https://www.jpcert.or.jp/java-rules/msc02-j.html

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

 

SecureRandomクラスのサンプル

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メソッドの引数は、アルゴリズム名です。
その他のアルゴリズム名については、
以下の「SecureRandom乱数生成アルゴリズム」のリンクを参照願います。
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#SecureRandom

15行目は、nextIntメソッドで0~2のいずれかの数値を生成しています。
18行目は、nextIntで0~2のいずれかの数値を取得し、1を足して1~3としています。

 

Randomクラスのサンプル

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

	        // 0〜9の数値を生成
	        System.out.println(r1.nextInt(10)); //

	        // 1~9の数値を生成
	        System.out.println(r1.nextInt(9) + 1); //
 	}
}

12行目は、nextIntメソッドで0~9のいずれかの数値を生成しています。
15行目は、nextIntで0~8のいずれかの数値を取得し、1を足して1~9としています。

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

 

Mathクラスのrandomメソッド

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

package test1;

public class Test1 {
	public static void main(String[] args) {

		 // 引数なし
		System.out.println(
				Math.random()); //例:0.18921156156291252
		
		// 0〜9の乱数を生成		
		System.out.println(
				(int)(Math.random()*10)); //
	        
	    // 1~9の乱数を生成
		System.out.println(
				(int)(Math.random()*9+1)); //
 	}
}

12行目は、Math.random()*10で、0~9のいずれかの数値を生成します。
16行目は、Math.random()*9で、0~8のいずれかの数値を生成し、1を足して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)

△上に戻る