JavaScript | 基礎構文:数値・演算 – 乱数

JavaScript JavaScript
スポンサーリンク

乱数を一言でいうと

乱数(らんすう)は、
「実行するたびに結果が読めない“ランダムな値”」 のことです。

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 のどれか
JavaScript

min 以上 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); // インデックスと選ばれた要素
JavaScript

fruits.length は要素数なので、
例えば length が 4 の場合、
Math.floor(Math.random() * 4) は 0〜3 のどれかになります。

それをそのままインデックスとして使えば、
配列の任意の要素がランダムに選べます。

ここが重要です。
「ランダムに要素を選びたい」=「ランダムなインデックスを作る」。
配列の長さを掛けてから floor する、という流れを覚えておいてください。


乱数と条件分岐・確率

50% の確率で何かをする

乱数は「確率的な処理」にも使えます。

if (Math.random() < 0.5) {
  console.log("表");
} else {
  console.log("裏");
}
JavaScript

Math.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);
JavaScript

CSS に渡すときなど、
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

自分で結果を眺めながら、
「この式がどういう範囲を作っているのか?」を意識すると、
乱数の扱い方がぐっと身近に感じられるはずです。

タイトルとURLをコピーしました