Javaでプログラムを作成する場合、乱数を利用することは機会は意外と多く出会います。
Javaには乱数を生成する際、利用できるクラスとしてMathクラスとRandomクラスが提供されており、各クラスの基本的な使い方をご紹介していきたいと思います。
Javaで利用される乱数とは
Javaのサンプルコードで乱数の生成方法をご紹介する前に、乱数とは何かについてご紹介しておきたいと思います。
そもそも乱数ってなに?
乱数は、どんな値が出るか分からないランダムに出力された数値のことを指します。
Javaでは整数値以外にも小数点の値などを含めた乱数を取り扱うことが可能です。
乱数の使いどころは?
Javaのシステムで乱数を使う機会としては、暗号化処理やシミュレーション、ゲーム関連のプログラムを作成する際に頻繁に利用されます。
Javaで利用できる乱数を生成するためのクラスとは
Javaで乱数を生成するためには「Mathクラス」と「Random」クラスが利用されます。
それぞれの基本情報をご紹介していきます。
Mathクラス
Javaで提供されているMathクラスは乱数生成のためのクラスというわけではなく、様々な数値に関する計算や処理を行う際に利用するクラスです。
Mathクラスから提供されている「random」メソッドを利用することで簡単に乱数を生成することが可能となります。
Randomクラス
Randomクラスは乱数生成用のクラスで様々な型で値を返すことが可能です。
Randomクラスで生成される乱数は「シード」と呼ばれる数値から乱数を生成する「乱数ジェネレーター」です。
Randomクラスで生成した乱数は、「シード」の値が分かると生成される値を予測することが出来ることから、プログラミングで生成する乱数を意味する「擬似乱数」と呼ばれています。
Javaで乱数を生成してみよう
ここからは「Math」クラス、「Random」クラスのサンプルコードを掲載しながら基本的な使い方をご紹介していきたいと思います。
Mathクラスを利用して乱数を生成してみよう
まずはMathクラスの「random」メソッドを使用して乱数を生成したサンプルコードです。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { double random1 = Math.random(); double random2 = Math.random(); double random3 = Math.random(); double random4 = Math.random(); double random5 = Math.random(); System.out.println("random1で生成された乱数値= " + random1); System.out.println("random2で生成された乱数値= " + random2); System.out.println("random3で生成された乱数値= " + random3); System.out.println("random4で生成された乱数値= " + random4); System.out.println("random5で生成された乱数値= " + random5); } }
上記のサンプルコードを実行した結果が下記の通りです。
random1で生成された乱数値= 0.7578561252881084 random2で生成された乱数値= 0.6364874973761343 random3で生成された乱数値= 0.8727511590392631 random4で生成された乱数値= 0.8266712686999307 random5で生成された乱数値= 0.20529514974288865
サンプルコードでは「random」メソッドで5つの乱数を生成し値を出力していますが、それぞれの値が0.0~1.0未満でランダムに生成された値となっていることがご確認頂けるかと思います。
Randomクラスを利用して乱数を生成してみよう
次にRandomクラスを利用して乱数を生成するサンプルコードをです。
Randomクラスにはいくつかのメソッドが提供されており、利用するメソッドによって生成出来る乱数の条件が変わってきます。
シード指定なしで乱数を生成
import java.util.*; import java.lang.Math; public class Main { public static void main(String[] args) throws Exception { Random random1 = new Random(); boolean result1 = random1.nextBoolean(); int result2 = random1.nextInt(); int result3 = random1.nextInt(10); long result4 = random1.nextLong(); double result5 = random1.nextDouble(); System.out.println("nextBooleanで生成された乱数値= " + result1); System.out.println("nextIntで生成された乱数値= " + result2); System.out.println("nextInt(引数指定有り)で生成された乱数値= " + result3); System.out.println("nextLongで生成された乱数値= " + result4); System.out.println("nextDoubleで生成された乱数値= " + result5); } }
上記のサンプルコードを実行した結果が下記の通りとなります。
nextBooleanで生成された乱数値= false nextIntで生成された乱数値= 696511038 nextInt(引数指定有り)で生成された乱数値= 4 nextLongで生成された乱数値= 4299442523040172609 nextDoubleで生成された乱数値= 0.5163669753253227
それぞれ「nextBoolean」メソッドではboolean型の結果を返し、「nextDouble」メソッドではdouble型の結果を返却する乱数ジェネレーターとなります。
「nextInt」メソッドにはint型の引数を指定する事が可能で、「指定した引数の値 – 1」の範囲内で乱数が生成されます。
シード指定有りで乱数を生成
import java.util.*; import java.lang.Math; public class Main { public static void main(String[] args) throws Exception { Random random1 = new Random(3); // ※1 boolean result1 = random1.nextBoolean(); int result2 = random1.nextInt(); int result3 = random1.nextInt(10); long result4 = random1.nextLong(); double result5 = random1.nextDouble(); System.out.println("nextBooleanで生成された乱数値= " + result1); System.out.println("nextIntで生成された乱数値= " + result2); System.out.println("nextInt(引数指定有り)で生成された乱数値= " + result3); System.out.println("nextLongで生成された乱数値= " + result4); System.out.println("nextDoubleで生成された乱数値= " + result5); Random random2 = new Random(3); // ※2 boolean result6 = random2.nextBoolean(); int result7 = random2.nextInt(); int result8 = random2.nextInt(10); long result9 = random2.nextLong(); double result10 = random2.nextDouble(); System.out.println("【2つ目】nextBooleanで生成された乱数値= " + result6); System.out.println("【2つ目】nextIntで生成された乱数値= " + result7); System.out.println("【2つ目】nextInt(引数指定有り)で生成された乱数値= " + result8); System.out.println("【2つ目】nextLongで生成された乱数値= " + result9); System.out.println("【2つ目】nextDoubleで生成された乱数値= " + result10); } }
上記のサンプルコードを出力した結果が下記の通りとなります。
nextBooleanで生成された乱数値= true nextIntで生成された乱数値= -1879439976 nextInt(引数指定有り)で生成された乱数値= 0 nextLongで生成された乱数値= -3592491610238171408 nextDoubleで生成された乱数値= 0.581865769150212 【2つ目】nextBooleanで生成された乱数値= true 【2つ目】nextIntで生成された乱数値= -1879439976 【2つ目】nextInt(引数指定有り)で生成された乱数値= 0 【2つ目】nextLongで生成された乱数値= -3592491610238171408 【2つ目】nextDoubleで生成された乱数値= 0.581865769150212
注目して頂きたいのが※1と※2の行で、Randomクラスのインスタンスを生成する際に同じシード値を指定しています。
すると出力結果のように何度実行しても同じ結果が返ってくる事がご確認頂けます。
さいごに:Javaで乱数を扱うクラスは「Math」と「Random」
本記事では、Javaで乱数を生成出来る方法として「Math」クラスの「random」メソッドと「Random」クラスをご紹介してきました。
手軽に0.0〜1.0未満の乱数を生成したい場合には「Math」クラス、それ以外は基本的に「Random」クラスを使用するのが一般的となるようです。
今回ご紹介した基本的な使い方を参考に、乱数生成のプログラムを作成してみてください。
「random」メソッドから返却される値は0.0~1.0未満の範囲でdouble型の乱数となります。