「0 以上 n 未満のランダムな整数」を作るという発想
Math.floor(Math.random() * n) は、0 以上 n 未満の整数をランダムに生成するための定番パターンです。 たとえば「0〜9のランダムな数字」「配列のランダムなインデックス」「サイコロの目(少し工夫して)」など、ランダムな選択をしたい場面で頻繁に使われます。
天才プログラマー視点で言うと、「ランダムな小数を、使いやすい整数に変換するための基本形」がこの書き方です。
Math.random() が返す値の範囲を理解する
まず、Math.random() が何を返すかを押さえておく必要があります。 Math.random() は、0 以上 1 未満のランダムな小数を返します。
つまり、 0.0xxx や 0.5xxx や 0.9xxx といった値がランダムに出てきますが、1.0 以上にはなりません。
このままでは「0〜1の間の小数」なので、 そのままでは「整数のランダム値」としては使いづらい状態です。 そこで「掛け算」と「切り捨て」を組み合わせて、欲しい範囲の整数に変換していきます。
「× n」で 0 以上 n 未満の小数に広げる
Math.random() に * n を掛けると、0 以上 n 未満の小数になります。
例えば n が 10 の場合を考えてみます。
Math.random() が 0.0 なら 0.0 * 10 = 0.0 Math.random() が 0.5 なら 0.5 * 10 = 5.0 Math.random() が 0.999… なら 0.999… * 10 ≒ 9.99…
このように、 「0〜1 の小数」を「0〜n の手前までの小数」にスケールアップしているイメージです。
ここまでで、 0 以上 n 未満の「ランダムな小数」が手に入ったことになります。
Math.floor で「整数」に変換する(ここが重要)
次に使うのが Math.floor です。 Math.floor(x) は、小数点以下を切り捨てて「それ以下の最大の整数」にするメソッドです。
例えば、
Math.floor(0.1) は 0 Math.floor(3.9) は 3 Math.floor(9.99) は 9
となります。
これを Math.random() * n に対して使うと、
Math.floor(Math.random() * 10) は、 0〜9 のどれかの整数をランダムに返すようになります。
つまり、 「0 以上 n 未満のランダムな整数」を作るために、 ランダムな小数 → スケールアップ → 切り捨て、という 3 ステップを踏んでいるわけです。
具体例:0〜9 のランダムな数字
実際のコードで見てみます。
const n = 10;
const r = Math.floor(Math.random() * n);
console.log(r); // 0〜9 のどれか
JavaScriptこの r は、 0, 1, 2, …, 9 のいずれかになります。
どの数字になるかは毎回変わりますが、 どれも「ほぼ同じ確率」で出てきます。
この形は、「配列のインデックスをランダムに選ぶ」ときにもそのまま使えます。
const items = ["A", "B", "C", "D"];
const index = Math.floor(Math.random() * items.length);
const choice = items[index];
console.log(choice); // "A"〜"D" のどれか
JavaScriptここでは、 items.length が 4 なので、 Math.floor(Math.random() * 4) は 0〜3 のランダムな整数になり、 そのインデックスの要素がランダムに選ばれます。
具体例:サイコロ(1〜6)のランダムな目
サイコロの目のように「1〜6」の範囲でランダムな整数を作りたい場合は、 少しだけ工夫して「0〜5」を作ってから 1 を足します。
const dice = Math.floor(Math.random() * 6) + 1;
console.log(dice); // 1〜6 のどれか
JavaScriptMath.random() * 6 は 0〜6 未満の小数。 Math.floor で 0〜5 の整数。 最後に + 1 で 1〜6 の整数になります。
この「0〜(n-1) を作ってから、必要ならオフセットを足す」という考え方は、 ランダムな整数を扱うときの基本パターンになります。
まとめ:Math.floor(Math.random()*n) は「ランダム整数生成の定番フォーム」
Math.floor(Math.random() * n) は、
0〜1 のランダムな小数を Math.random() で作り、 * n で 0〜n 未満の小数に広げ、 Math.floor で 0〜(n-1) の整数に変換する、
という流れを 1 行にまとめたものです。
配列のランダムな要素選択、 ランダムな ID の一部生成、 ゲームの乱数処理など、
さまざまな場面で使える「ランダム整数生成の基本形」として、 ぜひ体で覚えていただきたい書き方です。
