すべての記事
テクノロジー

乱数生成器の仕組み:真の乱数と疑似乱数の違い

2026年1月14日読了6分

TheDailyUtilsの乱数生成器
無料の乱数生成器で任意の範囲の乱数を生成できます。

乱数とは何か

日常語では「ランダム」とは予測不可能であることを意味します。数学とコンピュータサイエンスでは、乱数にはより正確な意味があります。前の値をすべて知っていても次の値を予測できない場合、そのシーケンスは乱数です。決定論的な機械で真の乱数を実現することは根本的に難しい課題です。コンピュータは正確な命令に従って動作するため、本質的に予測可能です。この問題への解決策は大きく2つのカテゴリに分類されます:疑似乱数生成器(PRNG)と真の乱数生成器(TRNG)です。

疑似乱数生成器(PRNG)

PRNGは、ランダムに見える数値のシーケンスを生成する決定論的アルゴリズムですが、シードと呼ばれる初期値によって完全に決定されます。同じシードを与えると、PRNGは常に同じシーケンスを生成します。これは欠点のように聞こえますが、実際には多くの場面で有用な特性です。

現代で最も広く使われているPRNGはメルセンヌ・ツイスターで、2^19937 − 1という周期を持ちます(これだけの値を生成してから繰り返します)。ほぼすべての統計的乱数テストに合格します。プログラミング言語の汎用乱数関数の多く — Pythonのrandomモジュール、Javaのjava.util.Random、JavaScriptのMath.random() — は内部でPRNGを使用しています。

重大な制限:PRNGは暗号学的に安全ではありません。攻撃者が十分な数の出力を観測できれば、内部状態を再構築してすべての将来の出力を予測できます。セキュリティに関わる用途には、PRNGを使用してはいけません。

暗号学的に安全な疑似乱数生成器(CSPRNG)

CSPRNGは、過去の出力を知っていても予測することが計算上不可能になるよう設計されたPRNGです。暗号学的な一方向関数を使用し、真のエントロピー源からシードを生成します。オペレーティングシステムは、LinuxやmacOSの/dev/urandom、WindowsのCryptGenRandomなどのインターフェースを通じてCSPRNGを提供しています。

アプリケーションコードでの使い方:

  • Python:secretsモジュール(パスワードやトークンにはrandomではなくこちらを使用)
  • JavaScript(Node.js):crypto.randomBytes()crypto.randomUUID()
  • ブラウザ:window.crypto.getRandomValues()
  • Java:java.security.SecureRandom

セキュリティに関わる操作(パスワード、トークン、セッションID、APIキー、暗号鍵、ノンスの生成)には常に暗号学的乱数APIを使用してください。

真の乱数生成器(TRNG)

TRNGは、電子部品の熱雑音、放射性崩壊、大気ノイズ、光子の到達時間など、本質的に予測不可能な物理プロセスから乱数を得ます。銀行や認証局で使用されるハードウェアセキュリティモジュール(HSM)にはTRNGが含まれています。random.orgのようなサービスは大気ノイズから乱数を生成し、宝くじやコンテストの検証可能な公正な乱数源として利用されています。

オペレーティングシステムのCSPRNGは通常、ハードウェアエントロピー源(キーボードのタイミング、ディスクI/O、IntelのRDRANDのようなハードウェアRNGチップ)からシードを得て、CSPRNGアルゴリズムでそのエントロピーをストリームに拡張します。このハイブリッドアプローチにより、ハードウェアエントロピーの予測不可能性とソフトウェア生成の速度を両立しています。

用途別の使い分け

  • ゲーム開発、シミュレーション、プロシージャル生成 — PRNGが最適です。再現性(固定シードによる)は多くの場合バグではなく機能であり、開発者が特定のシナリオを再生してデバッグできます。
  • 統計サンプリングとモンテカルロ法 — 十分にテストされたアルゴリズムのPRNG。メルセンヌ・ツイスターが標準的です。
  • パスワード、トークン、暗号鍵、UUID — CSPRNGのみ。これらの用途にMath.random()や同等のものを絶対に使用しないでください。
  • ギャンブル、宝くじ、証明可能な公正なシステム — TRNGまたはCSPRNG。ソースの透明性も重要です。
  • A/Bテストとランダム化実験 — ユーザーIDでシードを設定した再現可能なPRNG。不正が懸念される場合はシード生成にCSPRNGを使用。

シードと再現性

再現性が重要な場合(特定のテストシナリオの再現、生成結果の共有、シミュレーションのデバッグ)、固定値でPRNGをシードすることで常に同じ出力を得られます。多くのゲームはワールド生成にシードを使用し、プレイヤーが興味深いマップのシードを共有できるようにしています。機械学習の研究者も、実験の開始時に乱数ライブラリをシードすることで、実行間で再現可能な結果を保証することがよくあります。

シードの品質も重要です。現在のタイムスタンプ(ミリ秒単位)でシードを設定したPRNGは、攻撃者がアプリケーションの起動時刻を概ね知っていれば予測可能です。非セキュリティ目的にはタイムスタンプのシードで通常は問題ありませんが、出力が推測不可能でなければならない用途には、CSPRNGを使ってシードを生成してください。

乱数をオンラインで生成する

無料の乱数生成器を開く — 任意の範囲で1つまたは複数の乱数を、重複あり・なしで生成できます。ブラウザ上で動作します。

random numberscryptographyRNGPRNGtechnology