実用ツール

乱数とは?乱数生成の仕組みと使い方を徹底解説

この記事のまとめ(TL;DR)

コンピュータの乱数には「疑似乱数(PRNG)」と「真の乱数(TRNG)」があり、用途で使い分けが必要です。ゲーム・抽選・テストには `Math.random()`、暗号化・パスワード生成には `crypto.getRandomValues()` を使うのが鉄則です。本記事では仕組み・実装・落とし穴を解説します。

抽選・ゲーム・暗号化・テストデータ生成・モンテカルロシミュレーション・統計サンプリング — 乱数はコンピュータサイエンスのあらゆる場面で必要不可欠です。しかしコンピュータで生成される「乱数」は本当にランダムなのでしょうか?答えは「ほとんどがランダムに見える数列」で、用途を間違えるとセキュリティ事故の原因にもなります。本記事では、乱数生成ツールを使った実用例を交えながら、疑似乱数・真の乱数の違いを解説します。

乱数とは

乱数(らんすう)とは、規則性がなくランダムに出現する数のことです。サイコロを振って出る目やコイン投げの結果のように、予測不可能な数値を指します。コンピューターサイエンスでは、乱数はセキュリティ、シミュレーション、ゲーム、統計処理など幅広い分野で不可欠な存在です。

疑似乱数と真の乱数

乱数には大きく分けて2種類あります。それぞれの特徴を理解することが重要です。

項目疑似乱数(PRNG)真の乱数(TRNG)
生成方法数学的アルゴリズム物理現象(熱雑音、放射性崩壊等)
予測可能性シード値が分かれば再現可能予測不可能
生成速度高速比較的低速
再現性同じシードで同じ系列を再現再現不可能
用途ゲーム、シミュレーション、テスト暗号化、セキュリティ
代表例メルセンヌ・ツイスタ、線形合同法ハードウェアRNG、RANDOM.ORG

プログラミングでの乱数生成

主要なプログラミング言語での乱数生成方法を紹介します。

// JavaScript - 疑似乱数(セキュリティ用途には不向き)
Math.random()              // 0以上1未満の浮動小数点数
Math.floor(Math.random() * 100)  // 0〜99の整数

// JavaScript - 暗号学的に安全な乱数(セキュリティ用途向け)
crypto.getRandomValues(new Uint32Array(1))[0]
// ブラウザ・Node.js両方で利用可能

// Python
import random
random.randint(1, 100)     # 1〜100の整数(疑似乱数)

import secrets
secrets.randbelow(100)     # 0〜99の整数(暗号学的に安全)

重要:Math.random()は暗号学的に安全ではありません。パスワード生成やトークン生成には必ずcrypto.getRandomValues()を使用してください。

活用シーン

分野用途推奨される乱数
抽選・くじ引き当選者の選出、景品の割り当て疑似乱数でOK
ゲームダメージ計算、アイテムドロップ、マップ生成疑似乱数でOK
テストテストデータの生成、ファジング疑似乱数でOK
暗号化暗号鍵の生成、IV(初期化ベクトル)暗号学的乱数が必須
セキュリティパスワード生成、セッショントークン暗号学的乱数が必須
統計・シミュレーションモンテカルロ法、確率分布のサンプリング疑似乱数でOK

よくある質問

Math.random()は本当にランダムですか?

Math.random()は疑似乱数であり、内部的には決定的なアルゴリズム(多くのブラウザではxorshift128+)で生成されています。統計的には十分にランダムですが、シード値がわかれば再現可能なため、暗号用途には使えません。

乱数に偏りがあるか確認する方法は?

カイ二乗検定やコルモゴロフ-スミルノフ検定などの統計的検定を使って乱数の一様性を検証できます。簡易的には、大量の乱数を生成してヒストグラムを作成し、偏りがないか視覚的に確認する方法もあります。

特定の範囲の整数乱数を生成するには?

min〜maxの整数乱数は Math.floor(Math.random() * (max - min + 1)) + min で生成できます。例えば1〜6のサイコロなら Math.floor(Math.random() * 6) + 1 です。本ツールはこの計算を内部で実装しており、min/maxを入力するだけで結果を得られます。

パスワードに使う乱数はどのように生成すべきですか?

必ず暗号学的に安全な乱数生成器(CSPRNG)を使ってください。JavaScript なら crypto.getRandomValues()、Python なら secrets モジュール、Node.js なら crypto.randomBytes()パスワード生成ツールはこれらを使って安全なパスワードを作成しています。

乱数生成にシード(種)を指定できますか?

JavaScriptの標準 Math.random() はシード指定不可です。再現可能な乱数列が必要な場合(テスト・シミュレーション)、seedrandom ライブラリや MersenneTwister 実装を使います。Pythonでは random.seed()、numpy では np.random.seed() が使えます。

まとめ

乱数は「目的に応じた使い分け」が最重要です。ゲーム・抽選・テスト・シミュレーションには高速な疑似乱数(Math.random())、暗号化・パスワード・トークン生成には暗号学的に安全な乱数(crypto.getRandomValues())を使うのが鉄則。間違った用途での使用はセキュリティ事故の原因になり得るため、コードレビューでも注目されるポイントです。

関連ツール: 安全なパスワード生成には パスワード生成ツール、ユニーク識別子生成には UUID/ULIDジェネレーター、抽選には くじ引きツールもご活用ください。

乱数生成ツールを使ってみる

範囲を指定して乱数を瞬時に生成。整数・小数点数に対応しています。

ツールを開く →