お役立ち情報

Javaで乱数を使って出来ることとその使い方をまとめてみました

Javaの乱数

乱数の概念はプログラミングにおいて重要で、Javaに限った話ではありません。しかし、Javaは特に乱数を使用する機会が多く、それはWebシステムメインの言語であることや、規模の大きさに起因します。

Javaでは比較的大規模なWebシステムを構築することが多いですが、その際は不特定多数のユーザーがアクセスするためパスワードをランダムで生成するような機会が多いです。パスワードをランダムで生成するときは乱数を使用するので、実際のシステム開発でもよく使用する概念になります。

ぜひこの機会に、Javaの乱数を使ってできることや使い方を押さえておいてください。

乱数とは?

乱数という名称からなんとなく想像が付くかと思いますが、乱数とはランダムで出てくる数字です。Javaで乱数を取得する方法はいくつかありますが、基本的にはMathクラス、もしくはRandomクラスを使用します。

それぞれを正式に記述すると、「java.util.Random」「java.lang.Math」です。これが完全なクラス名なので、何もしていない状態で呼び出すには正式名称で記述する必要があります。

しかし、当然ながらこれを毎回記述するのは非効率的なので、パッケージごとインポートして使用するのが一般的なやり方になります。パッケージやインポートの概念は今回の本題ではないので割愛しますが、要するにすでに誰かが実装してくれている処理の塊を引用するための手続きです。

java.utilもjava.langも凄腕のプログラマーがコーディングしたもので、それがひとまとめのパッケージとして総合開発環境等には組み込まれています。なのでクラスの正式名称を記述すれば呼び出せるのですが、それは面倒です。

なので、java.utilもjava.langもあらかじめインポートして使用します、と宣言しておけば、クラス名の後ろを記述するだけで呼び出せる、という仕組みになっています。

乱数のイメージ

Randomクラスを使って乱数を作る

まずRandomクラスを使って乱数取得する方法を解説します。Randomクラスの主なコンストラクタは以下の二つです。

Random()
Random(long seed)

コンストラクタとは、クラスからインスタンス生成する際に実行されるメソッドのことです。上記のコードはどちらもRandomクラスからインスタンス生成して新たなインスタンス、もしくはオブジェクトを作っているのですが、その際にメソッドが自動的に実行されるようになっています。

そして、Random()のコンストラクタでは現在時刻が取得されるようになっています。Random(long seed)では、long型の乱数ジェネレータを作成します。なぜそのようになっているのかというと、java.util.Randomのなかでそのように実装されているからです。

Randomクラスのメソッド

次に、Randomクラスのメソッドについて解説します。以下のようなメソッドがあります。

nextInt()

戻り値の型:int
処理内容:int型の乱数を取得する。

nextInt(int value)

戻り値の型:int
処理内容:0~設定したvalue-1の乱数を取得する。

nextLong()

戻り値の型:long
処理内容:long型の乱数を取得する。

nextDouble()

戻り値の型:double
処理内容:0.0~1.0の間のdouble型の乱数を取得する。

nextFloat()

戻り値の型:float
処理内容:0.0~1.0の間でfloat型の乱数を取得する。

nextBoolean()

戻り値の型:boolean
処理内容:trueかfalse型の乱数を取得する。

基本的にはnext型、という構文で乱数を取得することができます。nextの横にそのまま型を書くメソッドなので、難しい点は特にないかと思います。

Mathクラスのメソッド

Mathクラスのメソッドは、random()を使用するのが基本です。Mathクラスのメソッド自体は他にもいろいろあるのですが、上で説明したRandomクラスのように乱数取得がメインのクラスではありません。

そのため、Mathクラスで乱数取得するにはrandom()メソッドを使用する、というイメージです。random()メソッドの戻り値の型はdoubleで、0.0~1.0未満の範囲で乱数を取得する仕様になっています。

Mathクラスで乱数を取得するにはRandomメソッドしかないのですが、これだと1未満の乱数しか取得できません。多くの場合乱数は整数を取得したいので、その場合取得した乱数に整数を掛ける仕様にコーディングすることで対処できます。

たとえば、取得した乱数に10を掛ける仕様にすれば0~9の乱数を取得することができます。RandomクラスとMathクラスの使い分けとしては、基本的にはRandomクラスで取得するのが一般的と言えるでしょう。

ただし、上で説明した通りRandomクラスとMathクラスではインポートするパッケージが異なります。乱数の取得をたとえば全体の処理で一回しか行わず、他の処理のためにjava.langのみをインポートしている、というシステムもあるでしょう。

その場合わざわざjava.utilをインポートしてまでRandomクラスを使用する必要はないので、Mathクラスで対応すると良いでしょう。

乱数

サンプルプログラム

乱数取得を使用するサンプルプログラムを紹介しますが、Javaでよくあるのはじゃんけんプログラムですが、Javaを一通り学習した型であれば、もしかすると見覚えがあるかもしれません。しかし忘れてる方もいらっしゃるかと思うので、紹介しておきます。

import java.util.Random;
public class RandomJanken {
public static void main(String[] args) {
String[] hands = { "グー", "チョキ", "パー" };
Random random = new Random();
for(int i=0 ; i<3 ; i++) {
String hand = hands[random.nextInt(3)];
System.out.println(hand);
}
}
}

上記のように、ランダム変数を使用してじゃんけんプログラムができます。まずクラスをインポートして、Randomクラスを使用できるようにしています。処理としてはhandsという出す手を格納した配列を用意し、Randomオブジェクトを生成します。

ループで回す必要はないのですが、Javaの練習プログラムではループで回すことが多いので、一応3回じゃんけんするようにしています。ループのなかではnextIntメソッドで0以上3未満の数字を取得しています。つまり、配列の0~2に格納されている、グー、チョキ、パー、のいずれかが取得できます。

最後に、取得した手を出力して終わりです。乱数はそのまま出力しても良いのですが、配列のインデックスに対応させることもできるという例でした。以上乱数について解説しました。

基本的にはクラスをインポートしてもともと用意されているメソッドを使用するだけなので、それほど難しいポイントはないかと思います。あとは、たとえばじゃんけんプログラムのように、応用的な使い方がいろいろとあります。

キャリアカウンセリングのプロとして
あなたに合った案件をご案内します。

まずはお気軽にお問い合わせください!

イメージ