JavaScript・文法の道具箱

ランダムであそぼう

おみくじ、サイコロ、ガチャ——押すたびに結果が変わるドキドキの正体が乱数。Math.randomで「予測できない楽しさ」をページに足そう。

ゲームのガチャ、おみくじ、サイコロ。押すたびに結果が変わるから、何度でも試したくなる——あのドキドキの正体が乱数(らんすう)です。JavaScriptなら1行で作れます。

まず素の姿を見てみよう

console.log(Math.random());

コンソールに0.8264097…のような小数が出ます。もう一度実行すると、まったく別の数。何が出るかは誰にも分かりません。

サイコロに変身させる

小数のままでは使いにくいので、「1〜6の整数」に加工します。決まり文句はこれです。

const dice = Math.floor(Math.random() * 6) + 1;

内側から順に読み解きます。

部分結果
Math.random()0〜0.999…の小数
× 60〜5.999…の小数
Math.floor( )小数点以下を切り捨てて0〜5の整数に
+ 11〜6に

Math.floorは「切り捨て」の道具です(floor=床。床のほうへ丸める、と覚えます)。6の部分を変えれば「1〜10」でも「1〜100」でも作れます。似た道具に四捨五入のMath.roundもありますが、乱数の加工には向きません——四捨五入だと両端の数だけ出にくくなり、公平なサイコロにならないのです。切り捨て一択で覚えましょう。

よく使うレシピ集

「掛けて、切り捨てて、足す」の型さえ覚えれば、いろいろな乱数が作れます。よく使う形をまとめておきます。

ほしい乱数書き方
0〜9の整数Math.floor(Math.random() * 10)
1〜10の整数Math.floor(Math.random() * 10) + 1
1〜100の整数Math.floor(Math.random() * 100) + 1
2分の1の判定Math.random() < 0.5

最後の行だけ形がちがいます。Math.random()の結果が0.5未満になる確率はちょうど半分なので、コインの表裏のような「50%の判定」は、この式をif文の条件にそのまま書くだけで作れます。

道を3つ以上に分ける:else if

前回のif文は「もしも/さもなければ」の2択でした。おみくじのように3つ以上に分けたいときは、あいだにelse if(さもなくば、もしも)をはさみます。

if (num === 1) {
  console.log("大吉!");
} else if (num === 2) {
  console.log("吉");
} else {
  console.log("ふつう");
}

上から順に調べて、最初に成り立ったところだけが実行されます。

JavaScriptもしも〜なら:if文「もしも/さもなければ」の基本をおさらいしたいときはこの回

動きを見てみよう

乱数・else if・イベントの合わせ技で、おみくじの完成です。

押すたびに1〜3の乱数を引き、ifelse ifelseで結果を出し分けています。同じボタンなのに結果が変わる——これが乱数の魔法です。

このレッスンのまとめ

  1. Math.random()0以上1未満のでたらめな小数が作れる
  2. 「1〜6の整数」はMath.floor(Math.random() * 6) + 1——掛けて、切り捨てて、足す
  3. 3つ以上に分けるときはelse ifをあいだにはさむ

やってみよう

今回学んだ「乱数」は、しまちゃんのページには使いません。おみくじ・クイズの出題・ゲームのように、毎回ちがう結果を楽しませたいページのための道具です。覚えておいて、必要になったら使いましょう。

よくある質問

1〜10のランダムな整数はどう作りますか?
Math.floor(Math.random() * 10) + 1と書きます。「何種類ほしいか(10)」を掛けて切り捨て、「いくつ始まりか(1)」を足すのが決まり文句です。
Math.floorのかわりにMath.round(四捨五入)を使ってもいいですか?
おすすめしません。四捨五入だと、いちばん小さい数といちばん大きい数だけ出る確率がほかの半分になり、公平なサイコロになりません。乱数の加工は切り捨て(Math.floor)が定番です。
同じ数が2回続けて出ました。壊れていますか?
壊れていません。本物のサイコロでも同じ目が続くことがあるように、毎回が独立した抽選なので、同じ数が続くのは自然なことです。