乱数を一言でいうと
乱数(らんすう)は、
「実行するたびに結果が読めない“ランダムな値”」 のことです。
JavaScript では、乱数を作るときにほぼ必ずMath.random()
を使います。
ここが重要です。Math.random() が返すのは、
0 以上 1 未満の「小数」(0 <= x < 1)。
これを「どういう範囲の数に変換するか」を自分で設計して使うのがポイントです。
Math.random() の基本
まずは素の動きを確認する
Math.random() は引数を取りません。
呼ぶたびに違う小数を返します。
console.log(Math.random()); // 0.123456789...
console.log(Math.random()); // 0.876543210...
console.log(Math.random()); // 毎回違う 0.xxxxx
JavaScript必ず 0 以上 1 未満なので、
0.0〜0.9999… のどこかの値になります。
1.0 ちょうどになることはありません。
「0〜1 の小数」だけでは使いづらい
このままだと、「0.374928… みたいな謎の小数」なので、
ゲームのサイコロ、くじ引き、配列からのランダム選択などに使うには、
少し工夫が必要です。
そこで重要になるのが、
掛け算(範囲を広げる)
Math.floor(小数点以下を切り捨てて整数に)
の組み合わせです。
ここが重要です。
乱数は、
「0〜1 の小数」 → 「欲しい範囲の数値」に変換する
この 2 ステップで考えると分かりやすくなります。
0 以上 N 未満の「整数」乱数を作る
0〜9 の整数を作る例
「0〜9(10 個)のどれか」を作りたい場合。
const n = Math.floor(Math.random() * 10);
console.log(n); // 0〜9 のどれか
JavaScript流れを分解するとこうです。
Math.random()
→ 0〜1 未満の小数
Math.random() * 10
→ 0〜10 未満の小数(0.0〜9.999…)
Math.floor(…)
→ 小数切り捨て → 0, 1, 2, …, 9 のどれか
つまり、Math.floor(Math.random() * 10) は
「0 〜 (10 – 1) の整数」 を作るパターンです。
一般化するとこうなる
「0 以上 N 未満の整数」がほしいときは、
Math.floor(Math.random() * N)
JavaScriptと書きます。
0〜4 → Math.floor(Math.random() * 5)
0〜99 → Math.floor(Math.random() * 100)
のように使います。
ここが重要です。
整数の範囲指定は「“個数”を掛けてから floor」。
“最大値そのもの”ではなく“何個欲しいか”を掛ける、と覚えるとミスが減ります。
任意の範囲 [min, max] の「整数」乱数を作る
1〜6(サイコロ)を作る例
サイコロのように「1〜6」の整数が欲しいときは、
まず「個数」に着目します。
1〜6 には 6 個の値があるので、
「0〜5 を作ってから +1」すればよい、という発想です。
const dice = Math.floor(Math.random() * 6) + 1;
console.log(dice); // 1〜6 のどれか
JavaScriptmin 以上 max 以下の汎用関数
任意の [min, max](両端を含む)で整数乱数を作るなら、こうできます。
function randomInt(min, max) {
// min 以上 max 以下の整数
return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(randomInt(5, 10)); // 5〜10 のどれか
console.log(randomInt(0, 0)); // 0
JavaScriptこの式の中身はこう考えます。
max - min + 1 → 「値の数」(たとえば 5〜10 なら 6 個)Math.random() * (max - min + 1) → 0〜その個数未満の小数Math.floor(...) → 0〜(個数-1) の整数+ min → min から始まる範囲にずらす
ここが重要です。
「[min, max] の整数乱数」の公式は、Math.floor(Math.random() * (max - min + 1)) + min
として暗記してしまって構いません。
ただし、なぜ +1 しているのか(個数のため)を理解しておくと、応用が効きます。
ランダムに配列から要素を 1 つ取り出す
配列のインデックスを乱数で決める
ある配列の中から、ランダムに 1 つ選びたいことはよくあります。
const fruits = ["apple", "banana", "orange", "grape"];
const index = Math.floor(Math.random() * fruits.length);
const choice = fruits[index];
console.log(index, choice); // インデックスと選ばれた要素
JavaScriptfruits.length は要素数なので、
例えば length が 4 の場合、Math.floor(Math.random() * 4) は 0〜3 のどれかになります。
それをそのままインデックスとして使えば、
配列の任意の要素がランダムに選べます。
ここが重要です。
「ランダムに要素を選びたい」=「ランダムなインデックスを作る」。
配列の長さを掛けてから floor する、という流れを覚えておいてください。
乱数と条件分岐・確率
50% の確率で何かをする
乱数は「確率的な処理」にも使えます。
if (Math.random() < 0.5) {
console.log("表");
} else {
console.log("裏");
}
JavaScriptMath.random() は 0〜1 未満の一様乱数なので、< 0.5 かどうかでちょうど半々になります。
これは「コイントス」のイメージです。
30% の確率で何かをする
if (Math.random() < 0.3) {
console.log("当たり!");
} else {
console.log("ハズレ");
}
JavaScript< 0.3 なら「0 〜 0.3」の範囲に入ったときだけ当たり、
確率は 30% になります。
ここが重要です。
ランダムな「真・偽」を作るときは
「Math.random() < 確率」
という形が定番です。
確率は 0〜1 の小数で考える(0.3=30%)と覚えておきましょう。
0〜1 の「小数」としてそのまま使うケース
アニメーションや透明度などの割合として使う
Math.random() の結果そのもの(0〜1)を、
「割合」としてそのまま使うこともあります。
例えば、ランダムな透明度を作る。
const opacity = Math.random(); // 0〜1
console.log(opacity);
JavaScriptCSS に渡すときなど、
0〜1 の範囲で扱うと都合が良い場面も多いです。
ランダムな実数値の範囲を作る
1.5〜3.5 のような、
小数を含むランダム値が欲しいとき。
function randomFloat(min, max) {
// min 以上 max 未満の小数
return Math.random() * (max - min) + min;
}
console.log(randomFloat(1.5, 3.5)); // 1.5〜3.5 のどこか
JavaScript(max - min) を掛けてから + min でずらす、という点は整数と同じですが、Math.floor で整数にせず、そのまま小数として使っているイメージです。
ここが重要です。
整数乱数との違いは「floor するかどうか」。
「小数のままランダム値が欲しいとき」は、掛け算+足し算だけで十分です。
乱数の「偏り」や「真のランダム」について軽く触れておく
Math.random は「擬似乱数」
Math.random() は、内部的には「擬似乱数生成器」で作られた値です。
完全に予測不能な「真のランダム」ではなく、
「ある法則に従って生成されるけれど、人間にはほぼ予測不能」な数列だと考えてください。
普通のアプリやゲームでは、Math.random() の乱数品質でまったく問題ありません。
ただし、暗号・セキュリティ用途など「ガチのランダム」が必要な場面では、Math.random() では不十分とされ、
専用の API(ブラウザの crypto.getRandomValues など)を使います。
連続して同じ値が出ることもある
「乱数」だからといって、
毎回きれいにバラけるわけではありません。
console.log(Math.floor(Math.random() * 3));
console.log(Math.floor(Math.random() * 3));
console.log(Math.floor(Math.random() * 3));
JavaScriptを実行したとき、1, 1, 1 のように同じ値が続くことも普通にあります。
ここが重要です。
乱数の“ランダムさ”とは、「均等に出ること」ではなく「先が読めないこと」。
「連続して同じ値が出たから壊れている」というわけではない、という感覚も持っておくと安心です。
初心者として本当に押さえてほしいポイント
Math.random() は 0 以上 1 未満の小数を返す。
これを「欲しい範囲の値」に変換して使う。
0〜N-1 の整数はMath.floor(Math.random() * N)
で作れる。
[min, max] の整数はMath.floor(Math.random() * (max - min + 1)) + min
という形が定番。(サイコロなど)
配列からランダムに 1 つ取りたいときは、
ランダムなインデックスを作って array[index]。
確率的な処理はif (Math.random() < 0.3) { ... }
のように「< 確率」で書く。
ここが重要です。
乱数は「0〜1 の小数がくる」→「掛け算・足し算・floor で変形する」の 3 ステップで考えると、どんな範囲でも怖くなくなります。
“サイコロを振る”“配列からランダムに選ぶ”“◯% の確率で起こる”といった処理を、
一度自分の手で Math.random() から組み立ててみると、乱数の感覚が一気に腹落ちします。
最後に、小さな練習を ひとつ置いておきます。
// 1〜6 のサイコロを 10 回振る
for (let i = 0; i < 10; i++) {
const dice = Math.floor(Math.random() * 6) + 1;
console.log(dice);
}
// 配列からランダムに 5 回選ぶ
const colors = ["red", "green", "blue", "yellow"];
for (let i = 0; i < 5; i++) {
const index = Math.floor(Math.random() * colors.length);
console.log(colors[index]);
}
JavaScript自分で結果を眺めながら、
「この式がどういう範囲を作っているのか?」を意識すると、
乱数の扱い方がぐっと身近に感じられるはずです。
