乱数ジェネレーターの仕組み: PRNG、CSPRNG、および真のランダム性
コンピューターは決定論的ですが、どうやって予測不可能な数値を生成するのでしょうか?シード、アルゴリズム、エントロピー、ブラウザーのランダム性に関する実践的なガイド。
乱数は、景品、ゲーム、シミュレーション、パスワード、暗号化を強化します。驚くべきことは、ほとんどの乱数はまったくランダムではないということです。これらは、外からは予測できない決定論的なプロセスによって生成されます。
重要なポイント
- 擬似乱数ジェネレーター (PRNG) は、シードを長い反復可能なシーケンスに変換します。
- 暗号的に安全な PRNG (CSPRNG) は、過去の出力が将来の出力を事実上明らかにできないように設計されています。
- 真のランダム性は、アルゴリズムだけからではなく、物理的なエントロピー ソースから得られます。
- ブラウザは、crypto.getRandomValues() を通じて CSPRNG を公開します。これは、毎日の公平な抽選には正しい選択です。
- 公平性は、値が範囲にどのようにマップされるかにも依存します。バイアスされたモジュロ演算により、一部の結果が静かに有利になる可能性があります。
ランダム性が見た目よりも難しい理由
コンピュータは指示に従います。同じプログラムを同じ入力で 2 回実行すると、通常は同じ出力が得られます。乱数発生器は、マシンを壊さずにその期待を裏切らなければなりません。
ソフトウェアは通常、2 つの層で問題を解決します。まず、タイミング ジッター、キーボード イベント、ハードウェア ノイズなどのソースから、エントロピーと呼ばれる少量の予測不可能なデータを収集します。次に、そのエントロピーを、長い数値ストリームを生成するアルゴリズムのシードとして使用します。ストリームはランダムに見えますが、シードとアルゴリズムによって完全に決定されます。
あのデザインは役に立ちますね。これにより、シミュレーションやテストで乱数を再現できるようになります。また、これは、シードの不十分なジェネレータが異なるマシン上で同じシーケンスを繰り返す可能性があることを意味します。これが、シードの品質が重要である理由です。
擬似乱数ジェネレーターの機能
PRNG は内部状態を保持します。数値を要求するたびに、状態が変換され、結果の一部が返されます。通常、変換は高速かつ決定的です。同じ開始状態であれば、同じシーケンスが再び表示されます。
ほとんどの PRNG は最終的にその状態を繰り返します。繰り返される前の値の数はピリオドと呼ばれます。期間が長いと役に立ちますが、発電機が自動的に安全になるわけではありません。十分な出力を観察できる攻撃者は、内部状態を再構築し、将来の値を予測できる可能性があります。
PRNG と CSPRNG の比較
汎用 PRNG は、速度と統計的品質に関して最適化されています。 CSPRNG は予測に抵抗するように設計されています。これは暗号化プリミティブを使用し、1 つの出力を学習しても次の出力が明らかにならないように構築されています。
JavaScript の Math.random() は、セキュリティが重要な作業には適していません。高速で便利ですが、エンジンは暗号化の品質を保証しません。ブラウザは、セキュリティ関連のランダム性を実現するために crypto.getRandomValues() を提供します。プラットフォームの暗号ソースを使用して、型付き配列にランダムなバイトを埋めます。
パスワード、トークン、賞品のある抽選など、攻撃者が予測したい可能性のあるものには、CSPRNG を使用します。装飾的なアニメーションや大まかなシミュレーションの場合は、通常の PRNG で十分な場合があります。
真のランダム性はどこから来るのか
ソフトウェア アルゴリズムでは、何もないところから情報を作り出すことはできません。真のランダム性は、放射性崩壊、熱雑音、ユーザー入力の正確なタイミングなどの物理的プロセスを通じてシステムに入ります。オペレーティング システムは、これらの信号をエントロピー プールに収集し、暗号ジェネレーターのシードに使用します。
最新のオペレーティング システムとブラウザでは、エントロピーが継続的に混合されます。抽選を行うためにマウスを振る必要はありませんが、システムは起動中および長期間アクティビティがなかった後に健全なエントロピー ソースを必要とします。これが、暗号ジェネレーターが即興ではなく慎重に設計されている理由の 1 つです。
このサイトのジェネレーターの仕組み
このサイトのツールはブラウザで crypto.getRandomValues() を使用します。結果はローカルで生成され、アップロードされません。
整数範囲の場合、ブラウザは 32 ビットの符号なし値を返します。単純なアプローチでは除算後の剰余を使用しますが、範囲が完全な 32 ビット空間に均等に分割されない場合、小さなバイアスが生じる可能性があります。ジェネレーターは代わりに拒否サンプリングを使用します。不偏領域の外側の値は破棄され、再描画されます。その結果、要求された範囲全体に均一な分布が得られます。
シャッフルでは、安全なランダム インデックスを備えたフィッシャー・イェーツ アルゴリズムが使用されます。ランダムな比較器を使用したカジュアルな並べ替えとは異なり、Fisher-Yates では、ランダムなインデックスが均一である場合、同じ確率ですべての順列が生成されます。
あなたのユースケースにとって十分なランダムとは何ですか?
予測可能性にコストがかからないアニメーション、ゲーム アート、または大まかなシミュレーションには、通常の擬似ランダム性を使用します。 CSPRNG は次の目的で使用します。
- パスワードとリカバリコード。
- 本物の賞品が当たるプレゼント、抽選会、オーディション。
- 人々をチームまたはグループにランダムに割り当てます。
- トークン、セッション識別子、およびセキュリティ関連のもの。
- 公的に防御する必要がある引き分け。
長期的な暗号キーの場合は、Web サイトではなく専用のキー管理システムを使用します。ブラウザーのランダム性は強力ですが、キーのライフサイクル、ストレージ、アクセス制御も初期ビットと同じくらい重要です。
単純な公平性チェック
多くの描画を実行して分布を確認することで、ジェネレーターを非公式にテストできます。 6 面サイコロの場合、すべての面がおよそ 6 分の 1 の確率で出現するはずです。ショートランは状況によって異なりますが、縞模様は正常です。重要なのは、そのプロセスが多数の試験にわたって公平であるかどうか、そして監査に十分な再現性があるかどうかです。
公開抽選の場合は、入力、設定、結果を記録します。この記録は、ランダム性を主張するよりも信頼に役立ちます。
結論
ランダム性とは、エントロピーの収集、アルゴリズムの選択、不偏なマッピング、透過的な使用といったエンジニアリング上の決定の連鎖です。優れたジェネレーターは、神秘的である必要はありません。重要な部分では予測不可能であり、使用される部分では文書化され、その限界については正直である必要があります。
ツールを試してみる
乱数生成器
任意の範囲の整数を選択します。