乱数
乱数はどの数字が出るのかがわからない、いわゆるランダムな出力をさせたいときに利用します。
Java でも出力に意外性を持たせたいときやゲームなどを作成際によく利用します。
今回はこの乱数の出し方や仕組みについて説明します。
Java の中にはこの乱数を出現させるためのパッケージが用意されています。
Math という数学に関するパッケージがあります。
その中に . random ( )という乱数に関するパッケージがあります。( .はその下のという意味です)
Math . random ( ) というこのパッケージを記述するだけで、ある程度の範囲内での乱数を出してくれます。
ではこのMath . random ( ) の( )の中の範囲はどこからどこまでかというと
Math . random ( ) = [ 0 , 1 )
[ 0 ⇐ は0は含まれる、1)⇐ は1は含まれないという意味があります。
つまり0~1までのランダムな少数(0~1なので少数しかあり得ないため)を出力してくれます。
例えば 0.1 , 0.32 , 0.789 ・・・・
この中のどれかはわかりませんが、Math . random ( ) を記述することによってどれかを出してくれます。(0は含まれていますが1は含まれていません)
ただこれで出してくれるのはあくまでも少数です。しかも1以下の少数です。実際に応用するときはもっと幅広く数字を出してもらいたいです。そこで、少し計算を組み合わせます。例えば整数を出してもらいたいときはどのようにするかというと…
Math . random ( ) にA(数字)を掛けます。するとその結果は
A = [ 0 , A ) となります。(0×A=0,1×A=A)
Aを掛けることによって一気に出力される上限が変わります。例えばA=10のときは0~10までをランダムで出してくれるようになります。
ですが、A が10だとしても出してくれる数は少数となってしまう可能性があります。
これではまだ少し不便なので、何らかの形にして整数に変えたいですね。では整数に変えるにはどのようにすれば良いかというと…
Java 独自の処理の仕方である int を利用します。
冒頭に( int )を記述することによって小数点以下は強制的に切り捨てとなるので、整数の値を得ることができるようになります。
( int ) = { 0, 1, ・・・・A-1 } (Aは含まれないので-1となります)
これでかなり整数の乱数を出すには近い形になりました。もしAが10の場合は0~9までの乱数を出してくれるということになります。
ただこれだとスタートの0という数字は決まっています。これはあまり好ましくない場合もあります。
もっと柔軟に数字を出したい場合はもう少し計算をします。
今度は Math . random ( ) にBを足します。
するとその結果は
B={ B, B+1, ・・・・・A+B-1}
このようにすると範囲はだいぶ柔軟に広がります。
A=10
B=100
とすると得られる値は
{100 , 101 , ・・・・・・109 }
がランダムに出されるということになります。
この乱数のベースとなっているのは Math . random ( ) です。
そこに Aを掛ける+切り捨て処理+Bを足す
という3ステップで乱数の対応範囲が広がります。
int の切り捨てに関してはこちらを参考にしてください
乱数の処理のしかた
- int ransu = ( int ) ( Math . random ( ) * A ) ;
- 0からA未満( A-1 )までのランダムな数(乱数)⇒ 0~A-1
- ( int ) ( Math . random ( ) * 2 ) ⇒ 0~1
- ( int ) ( Math . random ( ) * 20 ) ⇒ 0~19
- int ransu = ( int ) ( Math . random ( ) * A ) + B ;
- B から A + B 未満( A + B – 1 )までのランダムな数(乱数)⇒ B~A+B-1
- ( int ) ( Math . random ( ) * 100 ) + 1 ⇒ 1~100
- ( int ) ( Math . random ( ) * 50 ) + 10 ⇒ 10~59
Math . random ( ) の値はどこかに格納しなければなりません。
この値は最終的には整数になるので int ransu の変数の中に格納します。
次に切り捨て処理をおこないます。
( int ) ( Math . random ( ) ⇐ ( int ) を冒頭に付けることによって無理やりその後の少数の切り捨て処理をして整数に成形してもらいます。
Math . random ( ) * 2 ⇐ 2を掛けることによって0か1の2つの数字をランダムで出してくれます。
Math . random ( ) * 20 ⇐ 20を掛けると0~19までのランダムな数字を出してくれます。Math . random ( ) * 100 ) + 1 ⇐ 100個のランダムな数字を出してくれます。
+1というのは0からではなく1からスタートしてほしいときに記述します。
Math . random ( ) * 50 ) + 10 ⇐ 10から50個の数字をランダムで出してくれます。
つまりAとB2つの数字の役割としては、Aの数字の視点によって全部で何個、何通りの数字を出してくれるかが決まります。Bの数字の視点によってスタート(乱数の中の一番小さい数字)が決まります。
数字当てゲーム
- 0~9のいずれかを当てるゲーム
- 入力された結果が正解より大きいか小さいかを表示する
- 正解したら終了
正解が出るまではずっと回します。1回ユーザーから数字を得るごとにその数字と正解の数字を比較してその大小関係のフィードバックを出力します。それを見てユーザーに答えを調整してもらいます。正解になった時点でプログラムが終了という挙動となります。
▶プログラムコード
- import java . io . * ;
- class InputRansu {
- public static void main ( String [ ] args ) throws IOException {
- BufferedReader br = new BufferedReader ( new InputStreamReader ( System . in ) ) ;
- int ainput ; // ainput : 入力された値
- int answer = ( int ) ( Math . random ( ) * 10 ) ; // 正解の値
- while ( 1 > 0 ) {
- System . out . print ( ” 0~9を入力 =” ) ;
- String aString = br . readLine ( ) ;
- ainput = Integer . parseInt ( aString ) ;
- if ( ainput < answer ) {
- System . out . print ( ” 正解より小さいです “ ) ;
- } else if { ( ainput > answer ) {
- System . out . print ( ” 正解より大きいです “ ) ;
- } else {
- System . out . print ( ” 正解です!おめでとうございます! “ ) ;
- break ;
- }
- }
- }
ではコードの説明をしていきます。
- import java . io . * ;
- class InputRansu {
- public static void main ( String [ ] args ) throws IOException {
- BufferedReader br = new BufferedReader ( new InputStreamReader ( System . in ) ) ;
キーボードからの入力を受け付けるので最初に import java . io . * ; のパッケージの記述を忘れないように記述します。
続けてキーボード入力の決まりである BufferedReader 以降を記述します。
キーボード入力に関してはこちらを参考にしてください
- int ainput ; // ainput : 入力された値
- int answer = ( int ) ( Math . random ( ) * 10 ) ; // 正解の値
まず入力してもらった値を入れる変数( ainput )を用意します。
続けて正解の値の変数( answer )を用意します。これが乱数になります。
0~9までの10個のランダムな値はプログラムを実行するたびに変わります。
その値をいったん answer という変数に格納します。
ainput はユーザーから入力してもらった値、 answer は正解です。この2つの値を比べることによって、正解であるかどうかの判断をします。
- while ( 1 > 0 ) {
while ( 1 > 0 ) の条件文で0より1が大きい場合という条件となります。この条件では答えはいつも「真」となります。ということはこの while 文の内容は「無限ループ」となってしまいます。もちろんこれではゲームにはならないので、どのように処理するかは以下で説明しますがこの時点では while 以下のプログラムは無限にループされることになります。
while 文に関してはこちらを参考にしてください。
- System . out . print ( ” 0~9を入力 =” ) ;
- String aString = br . readLine ( ) ;
- ainput = Integer . parseInt ( aString ) ;
最初にプロンプト(ユーザーからの入力を受け付ける)メッセージ「0~9を入力 =」を表示します。
String aInput = br . readLine ( ) でコマンドラインからの入力を受け付けます。
受け取った値は文字列型としてコンピューターに認識されるのでその値を整数型に変換します。
ainput = Integer . parseInt ( aString )
大小を比較するので文字列型のままだと比較できません。 aString を整数型の ainput に変換して代入します。( ainput はすでに宣言済みです)
- if ( ainput < answer ) {
- System . out . print ( ” 正解より小さいです “ ) ;
- } else if { ( ainput > answer ) {
- System . out . print ( ” 正解より大きいです “ ) ;
- } else {
- System . out . print ( ” 正解です!おめでとうございます! “ ) ;
- break ;
次に条件分岐 if 文で判断します。
ainput < answer
ainput と answer を比較して、もし ainput が正解より小さい場合は「正解より小さいです」を出力します。
else if
そうでない場合で、もし ainput が正解より大きい場合は「正解より大きいです」と出力します。
それでもない場合、つまり ainput == answer である場合「正解です!おめでとうございます!」と出力します。
ここまでは無限ループとなります。ユーザーに正解が出るまで入力してもらうことになります。
ゲームとしては正解が出た時点で終わりにしたいので、正解になったら break 文を記述します。なので else 文は正解になった時点で while 文を強制終了します。
強制終了に関してはこちらを参考にしてください。
if 文に関してはこちらを参考にしてください。
数字当てゲーム(乱数生成のしくみ)
- 0~9のランダムな数(乱数)を用意
- ( int ) Math . rondom ( ) * A ⇒ 0~A-1
- A = 10
- 入力された結果が正解より大きいか小さいかを表示する
- 0~0.999999・・・の乱数( double 型)を生成
- 整数化 ( int )
- 切り捨て
- int answer = ( int ) ( Math . rondom ( ) * 10 ) ;
Math . rondom ( ) パッケージで0~9までのランダムな数字を用意します。Math . rondom ( ) は0以上1未満の少数を出してくれます。それにA(10)を掛けることで10個の数字が用意できます。少数では判断しづらいため、int 型に変換して切り捨て処理をおこなうことで10個の整数の用意ができます。
数字当てゲーム(処理のしかた)
- while ( 1 > 0 )
- 無限ループ
- break で終了する
- キーボード入力
- aString に格納
- int answer 型に変換して ainput に代入
while 文で正解が出るまで無限にループを回します。
正解が出ればそこで終了となります。
while ( 1 > 0 ) で正解が出るまではとにかく回します。(無限ループ)
正解が出たら break 文で強制終了にします。
- while ( 1 > 0 ) {
- System . out . print ( ” 0~9を入力 =” ) ;
- String aString = br . readLine ( ) ;
- ainput = Integer . parseInt ( aString ) ;
キーボード入力はいったんユーザーから受け取った値を aString に文字列型として格納します。それを int 型に変換して数字として比較できるようにします。
キーボード入力に関してはこちらを参考にしてください
実行結果は
0~9を入力=
(キーボードで何か適当な数字を入力)
正解より大きいです or 正解より小さいです
0~9を入力=
(キーボードで何か適当な数字を入力)
正解より大きいです or 正解より小さいです
0~9を入力=
(キーボードで何か適当な数字を入力)
(正解を入力できたら)
正解です!おめでとうございます!
が出力されます。
まとめ
このプログラムは乱数の特性を利用しています。数当てゲームは0~9までの10個の数字を用意しましたが、数字の個数を増やしたりメッセージを変えたりすることで様々なゲームに応用できます。乱数を利用してユーザー自由に答えを選べることで、応用の幅が広がってくるのではないでしょうか。乱数やキーボード入力などの武器をつかって自分なりのプログラムを作成して、ゲームや占い、おみくじなど色々なゲームを作ってみましょう。
キーボード入力に関してはこちらを参考にしてください。