Javaプログラミング初心者がまとめる記事。
初心者目線で事細かに見ていく。
はじめに
これまで少しだけ触れただけの「乱数」。
いい加減に使い方ぐらいまとめておこうと思ったから、今回は乱数について。
乱数が使えれば、今まで見てきたifとか四則演算などの計算式もちょっと面白くなる。
自分で「5+10」とか設定しても答えは「15」って分かるから、あまりプログラミングやってる感じは出ないね。
乱数とは
そもそも乱数っていうけど何?って最初は思うかもしれない。
私がこの言葉を知ったのはニコニコ動画だったな…。
WBCのイチローの動画見てた時に「乱数調整中…」ってコメントが流れた気がする。
この乱数というのは、英語で言えば「random number」。
カタカナで言うと、「ランダムナンバー」。
その名の通り、「ランダムな数字」ということで、何の数字が出てくるか分からないものということ。
なんとなく英語のほうが分かりやすいのでは…?
1から100の間で乱数を発生させたいとして、何の数字が出てくるか分からないのが「乱数」。
この乱数は完全にランダム。
数字の出現確率はどれも同じ。それが乱数。
乱数の使い方
乱数を発生させる方法はいくつかあるが、一度に詰めすぎても絶対に覚えない自信がある。
だから今回は一種類だけにする。
そうしよう。
それが「Math.random()」を使った方法。
この方法だと、これまでに学習した「キャスト」っていう方法をとるから、一緒におさらいできる。
1から100の間の整数をランダムで発生させたい!っていう場合は…
int A = (int)(100* Math.random() + 1);
と書く。
「なんのこっちゃわかんねぇ。」ってなる。
これは「A」の値が「(int)(100* Math.random() + 1);」ですよってこと。
だから右辺の「(int)(100* Math.random() + 1);」の意味が分かれば、「int A=5;」とかと見方は同じ。
そう考えたら難しくないと思う。
まず何故「(int)」を使うのか。
それは、「Math.random()」単体だと、それは0から1以下の小数点を含む数字をランダムに発生させるから。
「Math.random()」だけ使った形が以下。※パッケージ、クラス、メインメソッドは省略
System.out.println(A);
これを実行すると、「0.43110203058122953」と出た。
これは乱数だから、実行するたびに数字は変わる。
この結果から、「Math.random()」は「0から1未満の小数点を含む数字」を表示させるということがわかる。
「Math.random()」は小数点を含む数字を表すから、「A」も小数点になる。
よって、「小数点を表す数字」の変数の型である「double」を使用する。
intじゃないよ。doubleだよ。
今まで使っていた「int」は「整数」を表すもの。
「Math.random();」だけを使うなら乱数の結果は「0以上1未満の小数点を含む数字」だから「double」を使うってこと。
でも1から100の間の整数で表示させたい!
そうするために「int A = (int)(100* Math.random() + 1);」を使う。
この「(int)」っていうのは以前ちょこっと出した「キャスト」と呼ばれるもの。
下の記事でチラッと触れてる。
Javaプログラミング初心者の記録vol.8 数字の演算-割り算編
簡単に言うと、本来は小数点で表示されるはずのものを整数で表示させたりすることができる。
その逆もしかり。
整数で表されるはずのものを小数点で表示させることも可能ってこと。
キャストを使うときは、変換したい変数の型を()で囲めばよい。
今回は小数点で表されているものを整数で表示させたい。
ってことで「整数を表す変数の型」である「int」を()で囲む。
これがキャスト。
次の「100* Math.random()」についてだけど、上でも述べた通り「Math.random()」は「0から1未満の小数点を含む数字」。
これを100倍したら「0から100未満の小数点を含む数字」の乱数が発生することになる。
でもこのままだと「0が含まれて100が含まれない」ことになる。
だから「+1」をして、「0を含まず、100を含む」範囲にすることができる。
「100* Math.random() + 1」を()でくくる意味
「100* Math.random() + 1」が()で囲まれている件だけど、この()無しにして実行してみたらエラーになった。
「int A = (int)100* Math.random() + 1;」⇒エラー
左辺の変数の型を「double」にして実行したら、少数値の乱数が発生した。
「double A = (int)100* Math.random() + 1;」
(int)って書いてキャストにしてるのに?
キャストはすぐ後ろのプログラムの変数の型を別の型に変換する役割がある。
加えて、「100」と「Math.random()」は数字とメソッド(ランダムメソッド)の組み合わせの計算。
- 「(int)100* Math.random() + 1」としたら「100」しか変換されず、「Math.random()」は少数値のまま。
よってエラー。 - 「(int)Math.random()*100 + 1」としたら何故だか知らないけど「掛ける100(*100)」が無視された。
乱数を発生させるはずだったのに、実行してもずっと「1」しか表示されなくなった。
よって失敗。
int A = (int)(100* Math.random() + 1);
(int)が全体にかかるように「(100* Math.random() + 1)」と()でくくるとちゃんと乱数が発生するようになる。
ちなみに「100* Math.random()」の部分さえ変換させればいいから「(100* Math.random())+1」のようにしてもOK。
Math.randomはとにかく囲めばいいんだよ。
乱数は1から100だけじゃない
今回はint A = (int)(100* Math.random() + 1);とした。
もし1から1000の数字を表したかったら上の式の「100」の部分を「1000」に変えたらいい。
もし「int A = (int)(100* Math.random() + 1);」の「+1」の部分を「+3」にしたら、「3から102」の間で乱数が発生する。
色々応用できるよー。
まとめ
乱数についてはこんなものかな?
まだまだ勉強不足だからキャストについてちゃんと書けなかった気がする…。
Math.random自体は少数値を表すから、整数にしたかったら「int」を使わないといけない。
そこが今回ではポイントになる部分かな?
(個人的に)
この乱数を使って条件のプログラムを作ったら面白そう(やるとは言ってない)。
コメント