乱数発生器 – 即時、無料、そして真のランダム
乱数発生器とは何ですか?
乱数発生器(RNG)とは、計算、物理、またはハイブリッド方式のいずれかで、偶然よりも優れた予測が不可能な数列を生成するシステムである。各出力値は、それ以前の値とは統計的に独立しており、数列全体には、観察者が将来の出力を推測するために利用できるような明確なパターンは存在しない。この定義は単純に聞こえるが、実際にこれを実現することは、応用数学とコンピュータ科学における最も難しい問題の一つである。
「乱数発生器」という言葉は、しばしば混同される根本的に異なる2つの概念を指します。1つは、決定論的アルゴリズムを用いてランダムに見える数列を生成する擬似乱数発生器(PRNG) 、もう1つは、宇宙から真の物理的エントロピーを収集する真の乱数発生器(TRNG)です。3つ目のカテゴリーである暗号的に安全な擬似乱数発生器(CSPRNG)は、この2つの中間に位置します。実装は決定論的ですが、計算上実行可能な攻撃ではその出力を真の乱数と区別できないように設計されています。
乱数発生器が重要な理由
乱数発生器(RNG)は、科学、セキュリティ、そして日常的なソフトウェアに至るまで、あらゆる分野で不可欠な基盤となっています。信頼できる乱数がなければ、現代の暗号技術は崩壊します。TLSセッション、暗号化されたメッセージ、デジタル署名はすべて、予測不可能な秘密鍵に依存しているからです。カジノ、宝くじ、オンラインゲームは、公平性を確保するためにRNGに依存しています。気候モデリングから創薬まで、科学シミュレーションでは、解析的に解くことが困難な問題を近似するために、ランダムサンプリングが用いられます。統計的サンプリング、A/Bテスト、手続き型ゲームワールド生成、さらにはニューラルネットワークの重み初期化に至るまで、すべて高品質の乱数を必要とします。
乱数生成の不備がもたらす影響は深刻で、十分に立証されています。2012年、研究者たちは、インターネット上の数百万ものRSA公開鍵が、鍵生成に使用されたデバイスの起動時のエントロピー不足が原因で、共通の素因数を持っていることを発見しました。共通の素因数を因数分解できる攻撃者は、秘密鍵を復元し、すべての通信を復号化できます。2010年には、ソニーのPlayStation 3が、ECDSAの実装において署名ごとに同じ「乱数」ナンスを再利用していたために破られました。同じナンスが一度繰り返されるだけで、代数的に秘密鍵を抽出できてしまうのです。これらは例外的なケースではなく、乱数を解決済みの問題として扱うことによって必然的に起こる結果です。
主要な応用分野
- 暗号化とセキュリティ:鍵生成、初期化ベクトル、ノンス、ソルト、セッショントークン、証明書シリアル番号。
- シミュレーションとモデリング:モンテカルロ法、確率微分方程式、素粒子物理シミュレーション、疫学モデル。
- ゲームとギャンブル:カードシャッフル、サイコロの出目、スロットマシンの結果、プロシージャルレベル生成、戦利品テーブル。
- 統計と研究:無作為抽出、無作為化比較試験、ブートストラップ法、交差検証分割。
- 分散システム:リーダー選出、ジッターを考慮した負荷分散、ランダム遅延を伴う指数バックオフ。
- 機械学習:重み初期化、ドロップアウトマスク、データ拡張、確率的勾配降下法。
擬似乱数発生器の仕組み
擬似乱数生成器(PRNG)は、シード(単一の数値または小さなデータブロック)から始まり、決定論的な数学関数を繰り返し適用して、長い出力シーケンスを生成します。同じシードが与えられれば、シーケンスは完全に再現可能です。異なるシードが与えられれば、シーケンスは全く異なるものになります。PRNGの品質は、ランダム性に関する統計的テストにどれだけ合格するか、そしてセキュリティ用途においては、その出力から内部状態を推測できるかどうかによって評価されます。
線形合同生成器
最も古く単純な擬似乱数生成器(PRNG)ファミリーは、漸化式X n+1 = (aX n + c) mod mを使用します。ここで、a、c、m は慎重に選択された定数です。C 標準ライブラリのrand()関数は、多くの実装で線形合同法生成器(LCG)です。LCG は高速で実装も容易ですが、深刻な弱点があります。下位ビットが短い周期で循環し、シーケンス全体の周期は最大でも m であり、内部状態は少数の出力から容易に復元できます。セキュリティ要件のない単純なシミュレーションやゲームには適していますが、暗号化には全く適していません。
メルセンヌ・ツイスター
1998年に松本と西村によって発表されたメルセンヌ・ツイスター(MT19937)は、Python、Ruby、R、PHPをはじめとする多くの言語でデフォルトの擬似乱数生成器(PRNG)として採用されました。周期は2¹⁹⁹³⁷ − 1(天文学的に大きい)で、ほぼすべての統計的テストに合格し、高速に動作します。内部状態は624個の32ビット整数で構成されています。しかし、致命的な弱点があります。攻撃者が624個の連続した出力を観測すれば、内部状態全体を再構築し、将来のすべての出力を予測できてしまうのです。そのため、メルセンヌ・ツイスターはセキュリティが重視されるアプリケーションには全く不向きですが、その用途で広く誤用されています。
現代の擬似乱数生成器:Xoshiro、PCG、SFC
現在、最も優れた非暗号化擬似乱数生成器(PRNG)としては、 PCGファミリー(Permuted Congruential Generators)、 xoshiro256** 、およびSFC64が挙げられます。これらの生成器は、メルセンヌ・ツイスターよりも小型で高速であり、統計的にも優れています。特にPCGは、PRNGに対する最も要求の厳しい標準統計テストスイートであるTestU01 BigCrushテストにおいて優れた性能を発揮します。NumPyがバージョン1.17でデフォルトの生成器をメルセンヌ・ツイスターからPCG64に変更したのは、まさにこの理由からです。
暗号的に安全な擬似乱数生成器の仕組み
CSPRNGは、通常の統計的ランダム性に加えて、2つの特性を満たす必要があります。1つ目は、次ビットの予測不可能性です。これは、過去のすべての出力が与えられた場合、いかなる多項式時間アルゴリズムも、50%を超える確率で次のビットを予測できないことを意味します。2つ目は、状態漏洩耐性です。これは、攻撃者が現在の内部状態を知ったとしても、過去の出力を復元できないことを意味します(これは、後方秘匿性またはバックトラッキング耐性と呼ばれます)。
最新のオペレーティングシステムは、CSPRNGをコアサービスとして提供しています。Linuxは/dev/urandomとgetrandom()システムコールを公開しており、どちらもハードウェアイベントによってシードされたカーネルエントロピープールから取得します。WindowsはBCryptGenRandom()を提供します。macOSとiOSはarc4random_buf()を使用しており、macOS 10.12以降はChaCha20によってサポートされています。実用CSPRNGで使用される基盤となる構造には、 Hash_DRBG 、 HMAC_DRBG 、 CTR_DRBG (すべてNIST SP 800-90Aで標準化されています)のほか、BSDおよび最新のLinuxで使用されるChaCha20ベースのジェネレータが含まれます。
真の乱数発生器の仕組み
真性乱数発生器(TRNG)は、根本的に量子力学的な性質を持つか、あるいは測定不可能な初期条件に敏感なカオス的な古典系を含むため、真に予測不可能な物理過程からランダム性を抽出する。
一般的な物理的エントロピー源
- 熱雑音(ジョンソン・ナイキスト雑音):抵抗器内の電子のランダムな運動によって生じる電圧変動をサンプリングしてデジタル化することができる。
- ショットノイズ:検出器に光子や電子が離散的かつランダムに到着することで、測定可能なランダム信号が発生する。
- 放射性崩壊:放射性物質からの崩壊事象のタイミングは、まさに量子ランダムです。RANDOM.ORGは、同様に予測不可能な大気中の電波ノイズを利用しています。
- 量子光学光源:光子の到着時間、ホモダイン検出によって測定される真空ゆらぎ、およびビームスプリッターの経路選択はすべて、認証された量子ランダム性の源となる。
- コンシューマー向けデバイスにおけるハードウェアエントロピー:最新のCPUには、専用のハードウェア乱数生成器(RNG)命令が搭載されています。IntelのRDRANDは、AES-CBC-MACによって調整されたオンチップの熱雑音源を使用します。AMDの同等の機能は同様に動作します。ARMのTrustZoneには、オペレーティングシステムからアクセス可能なハードウェアエントロピー源が含まれています。
- オペレーティングシステムのエントロピープール: Linuxは、割り込みタイミング、ディスクI/Oレイテンシ、ネットワークパケットの到着時間、ハードウェアRNG命令からエントロピーを収集し、暗号化構造を通してそれらを組み合わせてカーネルのエントロピープールを生成します。
条件付けの問題
生の物理ノイズは、均一に分布することはまれです。熱雑音源は、回路の非対称性により、1よりも0をわずかに多く生成する可能性があります。そのため、TRNGには、生のサンプルをより短く、証明可能な均一な出力に圧縮する調整ステップ(通常は暗号学的ハッシュまたは抽出関数)が含まれています。消費される生のビットと生成される出力ビットの比率は、最小エントロピー率と呼ばれ、適切に設計されたTRNGはこの率を慎重に特性評価します。NIST SP 800-90Bは、連邦システムで使用されるエントロピー源のテストおよび検証要件を定義しています。
PRNG、CSPRNG、TRNGの比較
| 財産 | PRNG | CSPRNG | TRNG |
|---|---|---|---|
| 決定論的 | はい | はい(種まき後) | いいえ |
| 種子から繁殖可能 | はい | はい | いいえ |
| 統計的テストに合格する | いつもの | はい | はい(条件付け後) |
| 予測に対して安全 | いいえ | はい | はい |
| スピード | 非常に速い | 速い | 動作が遅い(ハードウェアの制限による) |
| ハードウェアエントロピーが必要 | 種まき専用 | 種まき専用 | いつも |
| 典型的な使用例 | シミュレーション、ゲーム、サンプリング | 鍵生成、トークン、暗号化 | 高信頼性キー、ギャンブル規制、研究 |
ランダム性の統計的定義
ランダム性は二値的な性質ではなく、スペクトル上に存在し、適切な基準は用途によって完全に異なります。あるシーケンスが特定の目的に対してランダムであるとみなされるのは、その目的に関連するテストで、理論的に理想的なランダムシーケンスと区別できない場合です。NISTは、頻度分析、ランテスト、スペクトル分析、線形複雑度など15のテストを含む統計的テストスイート(SP 800-22)を公開しています。モントリオール大学で開発されたTestU01ライブラリのBigCrushバッテリーはさらに厳しく、106の異なるテストを適用します。BigCrushに合格しないジェネレータは、実行速度に関係なく、本格的なシミュレーション作業には適していません。
ランダム性とは何を意味しないのかを明確にしておくことは重要です。1、2、3、4、5のような数列は、個々の数字の出現確率が等しいにもかかわらず、ランダムではありません。つまり、パターンは予測可能です。逆に、数列は偶然によって局所的にパターン化されているように見えることがあります(公平なコインで3回連続で表が出るなど)。しかし、それはランダム性ではないとは限りません。ランダム性とは、個々の出力シーケンスを単独で見た場合ではなく、生成プロセス自体の特性なのです。
乱数発生器の仕組み:基本原理と実践的な手法
乱数発生器は大きく2つのカテゴリーに分けられます。1つは初期値から始まる決定論的アルゴリズムを用いる擬似乱数発生器(PRNG)、もう1つは物理現象からエントロピーを導き出す真乱数発生器(TRNG)です。適切なタイプを選択し、正しく初期値を設定し、特定の用途に適用することで、統計的に妥当な結果、暗号的に安全な結果、あるいは予測可能な危険な結果が生じるかどうかが決まります。
乱数発生器の選択と使用に関する段階的な戦略
乱数を生成する前に、乱数生成器をタスクに適合させる必要があります。暗号鍵生成に高速な擬似乱数生成器を使用することは、ソフトウェアセキュリティにおける最も重大なミスの1つです。同様に、数十億回の反復を伴うモンテカルロシミュレーションに低速なハードウェア乱数生成器を使用すると、リソースを無駄に消費することになります。以下の手順では、基本原理から意思決定プロセスを順を追って説明します。
ステップ1:ランダム性の要件を定義する
ツールやライブラリに触れる前に、次の3つの質問を自問自答してください。
- 予測可能性は重要でしょうか?暗号、ギャンブル、宝くじ、セキュリティトークンなどにおいて、攻撃者があなたの数値を推測することで損害が生じる場合、暗号レベルの乱数性が必要です。物理シミュレーションを実行したり、プレイリストをシャッフルしたりするだけであれば、高品質の擬似乱数生成器で十分です。
- いくつの数字が必要ですか?一部の乱数生成器は有限の周期を持ちます。Pythonの
randomモジュールや多くの言語で広く使用されているメルセンヌツイスターの周期は2 19937 −1で、ほとんどの用途では天文学的に大きいですが、それでも有限で決定論的です。 - 再現性が必要ですか?科学実験や手続き型ゲーム生成では、全く同じシーケンスを再現する必要があることがよくあります。シード付き擬似乱数生成器(PRNG)はそれを可能にしますが、真性乱数生成器(TRNG)はそうではありません。
ステップ2:適切な発電機タイプを選択する
| 使用事例 | 推奨ジェネレーター | 例 |
|---|---|---|
| 暗号鍵、パスワード、トークン | CSPRNG(暗号学的に安全な擬似乱数生成器) | secretsモジュール(Python)、 crypto.randomBytes (Node.js)、 /dev/urandom (Linux) |
| シミュレーション、統計、機械学習 | 高品質の擬似乱数生成器 | メルセンヌ ツイスター、PCG64、xoshiro256** |
| 宝くじ、監査可能な抽選 | TRNGまたは認定ハードウェアRNG | RANDOM.ORG、ハードウェアセキュリティモジュール(HSM) |
| ゲーム、プロシージャル生成 | シード付き擬似乱数生成器 | メルセンヌ・ツイスター、良好な定数を用いたLCG |
| リアルタイム組み込みシステム | オンチップハードウェア乱数発生器 | Intel RDRAND、ARM TrueRNG |
ステップ3:ジェネレーターを正しくシードする
シードは、ほとんどの擬似乱数生成器(PRNG)において、唯一の障害点となります。脆弱なシードや予測可能なシードは、アルゴリズムがどれほど高度であっても、PRNGのセキュリティモデル全体を崩壊させてしまいます。
- 高エントロピーのシードを使用してください。オペレーティングシステムのエントロピープール(Unixでは
/dev/urandom、WindowsではCryptGenRandom)は、キーボードのタイミング、ディスク割り込み、ネットワークパケットの到着といったハードウェアイベントを組み合わせて、事実上予測不可能なシードを生成します。 - システムクロックのみをシード値として使用しないでください。プログラムの開始時刻のおおよその時刻を知っている攻撃者は、タイムスタンプに基づくシード値を数秒で総当たり攻撃によって解読できます。この脆弱性は、オンラインポーカーサイトや宝くじシステムに対する実際の攻撃で悪用されています。
- 本番環境のコードにシード値をハードコーディングしてはいけません。固定シード値を使用すると、実行ごとに同じシーケンスが生成されます。これはテストには便利ですが、セキュリティ上は致命的な問題となります。
- 長時間実行されるアプリケーションでは、定期的にシードを再生成してください。アプリケーションが数日または数週間実行される場合、定期的に新しいエントロピーを注入することで、ジェネレーターが予測可能な状態に陥るのを防ぐことができます。
ステップ4:ジェネレーターを特定のタスクに適用する
生の乱数を生成すること自体が最終目標となることは稀である。サンプリング、シャッフル、範囲マッピングといった実用的な応用には、それぞれ固有の不具合が生じる。
範囲内の数値を生成する
剰余演算子( rand() % N )を使用する単純なアプローチでは、剰余バイアスが発生します。ジェネレータの出力範囲が N で割り切れない場合、一部の値が他の値よりも頻繁に出現します。たとえば、ジェネレータが 0 から 32767 までの値を生成する場合、0 から 99 までの数値が必要な場合、32768 は 100 で割り切れないため、0~67 の値が 68~99 の値よりもわずかに多く出現します。
- 棄却サンプリングを使用します。偏りのある裾野に位置する値を破棄し、再描画します。適切に実装された標準ライブラリのほとんどは、これを自動的に行います。
- 組み込みの範囲関数を使用してください。Pythonの
random.randint(a, b)、Java のThreadLocalRandom.nextInt(origin, bound)などの関数は、バイアスを内部的に処理します。 - 暗号化用途には、Pythonの
secretsモジュールまたは同等のモジュールを使用してください。これらのモジュールは、デフォルトで偏りのない範囲選択を実装しています。
リストを公平にシャッフルする
フィッシャー・イェーツ・シャッフル(クヌース・シャッフルとも呼ばれる)は、一様ランダムな順列を生成する唯一の正しいアルゴリズムです。このアルゴリズムは、最後の要素から最初の要素まで順に処理を進め、各要素を現在の位置またはそれより前の位置にあるランダムに選択された要素と交換することで機能します。
- 最後のインデックスi = n−1 から開始します。
- 0 ≤ j ≤ i の範囲でランダムなインデックスjを選択します。
- 位置iとjの要素を交換します。
- iをデクリメントし、 iが0になるまで繰り返す。
単純な代替案、つまり各要素の位置を個別にランダムに選択する方法では、均一な分布は得られません。特定の順列が他の順列よりも頻繁に出現するため、これはカードゲームや宝くじにおいて測定可能で悪用可能な欠陥となります。
非復元抽出
n個の母集団からk個の固有値が必要な場合、重複を抽出して破棄する方法は非効率的です。大規模なデータセットやストリーミングデータセットにはリザーバーサンプリングを、小規模なデータセットには母集団のコピーに対してフィッシャー・イェーツサンプリングを使用してください。Pythonのrandom.sample(population, k)これを正しく効率的に実装しています。
ステップ5:発電機の出力品質をテストする
正しく実装された乱数発生器であっても、その統計的特性がアプリケーションの要求と一致しない場合、特定のアプリケーションでは不具合が発生する可能性があります。標準的なテストスイートは、ほとんどの欠陥を検出します。
- TestU01(BigCrush):擬似乱数生成器(PRNG)に対する最も厳密な統計的テスト群。数百ものテストを適用し、より単純なテストでは見逃してしまうような微妙な相関関係も検出できる。LCGの派生版を含む多くの古い乱数生成器は、BigCrushに合格しない。
- Diehard / Dieharder:ジョージ・マルサグリアによって開発された、広く用いられている統計検定のスイート。Dieharderは、その最新版であり、拡張版である。
- NIST SP 800-22:暗号用乱数発生器(RNG)の標準テストスイートであり、FIPS認証に必須です。周波数、ラン、スペクトル特性などをテストします。
- PractRand:周期が短い発電機や拡散性の低い発電機の故障検出に特に優れています。
Let AutoSEO write & rank this for you — on autopilot
Enter your site: we scan it, build a keyword plan, and publish ranking-ready articles for Google and AI answers. Start for $1.
避けるべきよくある間違い
実稼働システムにおける乱数発生器の障害のほとんどは、少数の繰り返し発生するエラーに起因します。これらのエラーを事前に認識することで、現実世界における脆弱性や統計的なアーティファクトの大部分を未然に防ぐことができます。
間違い1:セキュリティのためにMath.random()または同等のものを使用すること
JavaScriptのMath.random() 、Pythonのrandomモジュール( secrets以外)、PHPのrand() 、および同様の汎用関数は、暗号化用途には不向きであることが明示的に文書化されています。これらの関数は、予測不可能性よりも速度を優先しています。十分な数の出力値を観測した攻撃者は、わずか624個の連続した32ビット出力からメルセンヌ・ツイスターの内部状態を再構築し、将来のすべての値を予測することができます。この攻撃は、実際のギャンブルプラットフォームで実証されています。
間違いその2:セッション間で同じシードを再利用すること
ウェブアプリケーションがセッショントークン生成器のシードにサーバーのプロセスIDまたは起動タイムスタンプを使用する場合、同じ秒に生成されるすべてのセッショントークンは同じシードを共有することになります。これは理論上の話ではなく、実際に運用中のフレームワークにおけるセッションハイジャックの脆弱性の根本原因となっています。
間違い3:必要なエントロピーに対して生成するビット数が少なすぎる
6桁のPINコードは約20ビットのエントロピーを持ちます。UUID v4は122ビットです。暗号鍵は、対称暗号化には少なくとも128ビット、将来のハードウェアに対する長期的なセキュリティには256ビットが必要です。短いトークンを生成し、それが推測不可能であると想定することは、実装の詳細ではなく、構造的な欠陥です。
間違い4:プラットフォーム固有の動作を無視する
- 一部の古いLinuxカーネルでは、エントロピープールが枯渇すると
/dev/randomからの読み取りがブロックされます。/dev/urandom/dev/urandomブロックせず、初期起動後であればほとんどの暗号化用途で安全です。 - 仮想マシンは、物理マシンのようなハードウェアイベントの多様性がないため、起動時にエントロピーが低下する可能性があります。仮想マシンのインスタンス化直後にシードを設定すると、脆弱なキーが生成される可能性があります。
- 組み込みシステムの中には、ハードウェア乱数発生器を全く搭載していないものもあります。開発者は、ソフトウェアのみによるエントロピー生成に頼らざるを得ない場合もありますが、それは見た目よりもはるかに弱いものです。
間違い5:検証せずにシャッフルされた出力を均一ランダムとして扱うこと
基となる乱数生成器の周期がデータセットの可能な順列の数よりも短い場合、すべての順列を生成することはできません。標準的な52枚のカードデッキには、52! ≈ 2 226通りの並び順があります。32ビットのシードを持つ生成器は、最大で2 32 ≈ 40億通りの異なる並び順を生成できますが、これは可能なシャッフルのごくわずかな割合にすぎません。実際の賭け金がかかるカードゲームでは、これは具体的で悪用可能な弱点となります。
間違い6:独立性と均一性を混同する
数列は、各値が等しい頻度で出現する均一分布であっても、連続する抽出値の間には高い相関関係が存在する場合があります。多くの低品質なLCGは頻度テストには合格しますが、連続する値が多次元空間内の少数の超平面上に位置するため、スペクトルテストには不合格となります。LCGの格子構造として知られるこの特性により、LCGは多次元モンテカルロ積分には適しません。
プログラミング言語別実践的戦術
Python
- セキュリティ上重要な値には、
secrets.token_bytes(n)、secrets.token_hex(n)、またはsecrets.randbelow(n)を使用してください。 - OSのエントロピーに裏付けられた標準インターフェースが必要な場合は、
random.SystemRandom()をrandom.Random()の代替として使用してください。 - 数値計算には、デフォルトでPCG64ジェネレーターを使用する
numpy.random.default_rng()を使用してください。PCG64は、BigCrushに合格する最新の高品質な擬似乱数生成器です。
JavaScript / Node.js
- セキュリティ目的の場合は、
crypto.randomBytes(n)またはcrypto.getRandomValues()(ブラウザの Web Crypto API) を使用してください。 - トークン、ID、または攻撃者が予測しようとする可能性のあるものには、
Math.random()を絶対に使用しないでください。
Java
- 暗号化目的には、
java.security.SecureRandomを使用してください。インスタンスは一度作成したら再利用してください。インスタンスの生成にはコストがかかります。 - マルチスレッド環境における高スループットの非セキュリティアプリケーションには、
ThreadLocalRandom使用してください。 - 並行処理環境では
java.util.Random使用を避けてください。これは共有シードを使用するため、競合が発生すると衝突が発生する可能性があります。
C / C++
- C標準ライブラリの
rand()関数は使用しないでください。実装依存であり、多くの場合、弱いLCG(最小共役勾配法)であり、スレッドセーフではありません。 - 汎用用途には、
std::random_deviceでシードされた<random>のstd::mt19937使用してください。 - 暗号化用途では、OSのプリミティブを直接呼び出します。Linuxでは
getrandom()、WindowsではBCryptGenRandom使用します。
乱数発生器ツール、ソフトウェア、および自動化
最も広く使われている乱数生成ツールは、RANDOM.ORG(大気ノイズからエントロピーを抽出する)のようなブラウザベースのサービスから、主要なプログラミング言語すべてに組み込まれている暗号ライブラリまで多岐にわたります。適切なツールの選択は、用途によって異なります。統計シミュレーションには速度と統計的精度が求められ、セキュリティアプリケーションには暗号的な予測不可能性が求められ、物理実験には真のハードウェア乱数が求められます。
ブラウザベースおよびオンラインの乱数生成ツール
オンライン乱数生成ツールはインストール不要で、気軽な抽選、授業でのデモンストレーション、迅速な判断に適しています。最も評判の良いツールには以下のようなものがあります。
- RANDOM.ORG — 大気中の電波ノイズを真のエントロピー源として利用します。整数生成器、シーケンスシャッフラー、ガウス生成器、およびプログラムによるアクセス用のクォータベースのAPIを提供します。
- Googleに組み込まれている乱数生成器— Googleで「1から100までの乱数」を検索すると、システムのエントロピーから生成された擬似乱数生成器を使用して即座に結果が返されます。
- 数値選択ホイールツール— 内部で JavaScript の Math.random() を使用する視覚的な回転ホイールインターフェースで、教室やゲームショーのような選択に適しています。
- 非公式投票と名前抽選— リストへの入力とランダムな選択を組み合わせて、チーム分け、賞品抽選、グループでの意思決定に活用します。
ほとんどのブラウザツールの大きな欠点は、JavaScriptのMath.random()に依存していることです。これは擬似乱数生成器(PRNG)であり、暗号学的に安全ではありません。セキュリティ、トークン、または金融に関する意思決定に関わる場合は、専用の暗号化ツールまたはライブラリを使用してください。
プログラミング言語ライブラリと組み込み関数
主要なプログラミング言語には、少なくとも1つの乱数生成器(RNG)モジュールが付属しています。以下の表は、最も一般的に使用されているオプションとそのセキュリティ分類をまとめたものです。
| 言語 | 標準の擬似乱数生成器 | 暗号学的乱数発生器 | 注記 |
|---|---|---|---|
| Python | ランダム(メルセンヌ・ツイスター) | シークレット、os.urandom() | トークン、パスワード、キーにはシークレットを使用してください。 |
| JavaScript | Math.random() | crypto.getRandomValues() | Web Crypto APIは、すべての最新ブラウザで利用可能です。 |
| Java | java.util.Random | java.security.SecureRandom | SecureRandomは、十分なエントロピーが得られるまでブロックします。 |
| C / C++ | rand()(本番環境での使用は避けてください) | /dev/urandom、RDRAND命令 | rand() は弱いので、重要なことには OS レベルのエントロピーを使用してください。 |
| 行く | 数学/ランダム | 暗号通貨/ランド | 暗号/乱数はOSのCSPRNGから直接読み取られます |
| ルビー | ランダム(MTベース) | セキュアランダム | SecureRandomはOpenSSLまたは/dev/urandomをラップします |
| PHP | rand()、mt_rand() | random_bytes()、random_int() | random_int() は PHP 7 以降、CSPRNG をバックエンドとして使用しています。 |
ハードウェア乱数発生器デバイス
認証局の鍵生成、ハードウェアセキュリティモジュール(HSM)、科学計測機器など、最高品質のエントロピーを必要とするアプリケーション向けには、専用のハードウェア乱数発生器(HRNG)が利用可能です。
- Intel RDRAND / RDSEED — チップ上の回路から熱雑音をサンプリングするCPUレベルの命令で、Ivy Bridge(2012年)以降のほとんどの最新のx86プロセッサで利用可能です。
- 専用のUSB HRNG — OneRNGやTrueRNGなどのデバイスはUSBポートに接続し、Linuxでは/dev/randomまたは/dev/urandomを介してOSプールにエントロピーを供給します。
- HSM(ハードウェアセキュリティモジュール)とは、Thales、Entrust、AWS CloudHSMなどのベンダーが提供するエンタープライズグレードのデバイスで、認証済みのハードウェアエントロピー源を使用して暗号鍵を生成および保存します。
- 量子乱数発生器サービス― ID QuantiqueとANU(オーストラリア国立大学)のクラウドAPIは、量子真空ゆらぎから生成された乱数ビットを提供し、証明可能な非決定論的な出力を実現します。
自動化とワークフローの統合
大規模なワークフロー(A/Bテストパイプライン、モンテカルロシミュレーション、スケジュールされた抽選、ランダム監査サンプリングなど)内で乱数生成を自動化するには、通常、次の3つのアプローチのいずれかが用いられます。
- API連携— RANDOM.ORGは、真の乱数整数、シーケンス、文字列、およびUUIDを返すJSON-RPC APIを提供しています。認証済みリクエストでは、より高いクォータと、検証可能な認証証明書付きの署名付き乱数が利用可能です。
- CI/CDパイプラインのシード— TestU01やDieharderなどの統計的テストツールを継続的インテグレーションパイプラインで自動的に実行し、カスタムRNG実装がコード変更後も統計的品質を維持していることを検証できます。
- プラットフォームネイティブのスケジューリング— クラウドプラットフォーム(AWS Lambda、Google Cloud Functions、Azure Functions)は、スケジュールに基づいて乱数生成器(RNG)ベースのプロセスをトリガーできます。たとえば、セキュリティ監査のためにログエントリをランダムにサンプリングしたり、行動実験で毎日ランダム化されたコホートを割り当てたりすることができます。
AutoSEOのようなツールは、ランダムサンプリングに依存するコンテンツやデータワークフローにも自動化を拡張できることを示しています。AutoSEOは、ランダムサンプリング技術を用いて大規模なクロールデータセットから代表的なページサブセットを選択することで、SEOタスクの識別、監査、優先順位付けのプロセスを自動化します。これにより、品質チェックの偏りを防ぎ、常に同じトラフィック量の多いページを監査することによって生じる体系的な盲点を排除します。これは、ランダム化比較試験で使用されるロジックと同じです。選択プロセスに構造化されたランダム性を導入することで、AutoSEOは決定論的なルールベースの監査ツールよりも統計的に妥当なサイト健全性評価を生成します。
乱数発生器の品質と成功度を測定する方法
優れた乱数発生器は、均一性、独立性、予測不可能性に関する統計的テストに合格する。主な評価基準は、経験的テストスイート、理論的な周期分析、そして暗号学的乱数発生器の場合は状態再構築攻撃に対する耐性である。
統計的検定スイート
有限数列が真にランダムであると証明することはできないが、数列の非ランダム性を検出することは可能である。最も権威のあるテストスイートは以下のとおりである。
- NIST SP 800-22 — 米国国立標準技術研究所(NIST)が発行した15種類の統計的テストからなるスイートで、暗号認証のために提出された乱数発生器(RNG)を評価するために使用されます。テストには、周波数テスト、ランテスト、スペクトル(DFT)テスト、シリアルテストが含まれます。
- TestU01 (BigCrush) — モントリオール大学で開発されたBigCrushは、一般に公開されている統計的検定の中で最も要求度の高いテスト群です。LCGや旧式のWichmann-Hill生成器などのアルゴリズムは合格しませんが、Xoshiro256**とPCGは合格します。
- Dieharder ― George Marsaglia 氏が開発したオリジナルの Diehard バッテリーをオープンソースで拡張したもので、発電機の出力の大規模サンプルに対して 100 種類以上のテストを実行しています。
- PractRand ― 非常に大規模なサンプルサイズ(テラバイト規模の出力)にも対応できる最新のテストスイートであり、小規模サンプルテストでは検出できない微妙なバイアスも検出可能です。
主要品質指標
- 周期長— 数列が繰り返されるまでに生成される値の数。メルセンヌ・ツイスターの周期は 2 19937 −1 であり、これは暗号化以外のほぼすべての用途に十分です。
- 均等分布— 値が1次元、2次元、およびより高次元の射影において、出力範囲全体に均一に分布しているかどうか。
- シード感度― シードのわずかな変化によって、まったく異なる出力シーケンスが生成されるかどうか(シミュレーションの再現性にとって重要)。
- スループット— 出力速度(MB/秒、つまり1秒あたり数十億個の数値)で、高性能なモンテカルロ計算ワークロードに関係します。
- 前方秘匿性と後方秘匿性― CSPRNG(暗号論的に安全な擬似乱数生成器)において、時刻Tにおける出力を観測した攻撃者が、過去または未来の出力を復元できるかどうか。これは、観測されたビットから状態を復元しようと試みることでテストされる。
応用場面における成功の測定
技術的な品質以外にも、成功の指標は導入環境によって異なります。
- 宝くじや抽選においては、監査証跡、第三者による検証、署名入りのランダム性証明書(RANDOM.ORGから入手可能)によって、参加者に対する公平性が証明されます。
- 暗号化アプリケーション— FIPS 140-3またはCommon Criteria認証への準拠は、エントロピー源とCSPRNGが政府および業界の基準を満たしていることを証明します。
- 科学シミュレーション― 再現性(同じシード値で同じ結果が得られること)と、シミュレーションで使用されるサンプルサイズでBigCrushまたはPractRandを通過できる能力。
- A/Bテスト― バランスチェックにより、実験前の共変量に関して治療群と対照群が統計的に同等であることが確認され、ランダム化が偏りのないものであったことが検証されます。
よくある質問
真の乱数発生器と擬似乱数発生器の違いは何ですか?
真性乱数発生器(TRNG)は、熱雑音、放射性崩壊、大気電波雑音といった物理的で予測不可能なプロセスから乱数を生成し、真に非決定論的な出力を生成します。擬似乱数発生器(PRNG)は、初期値でシードされた決定論的な数学的アルゴリズムを使用します。同じシードが与えられると、常に同じ数列が生成されます。PRNGは高速で再現性が高いため、シミュレーションやゲームに最適です。TRNGは処理速度は遅いものの、暗号鍵の生成など、予測不可能性がセキュリティ要件となる場合には不可欠です。
JavaScriptのMath.random()は、セキュリティ上の目的で使用しても安全ですか?
いいえ。JavaScript のMath.random()は、暗号学的に安全ではないことが明示的に文書化されている擬似乱数生成器 (PRNG) です。その内部状態は、観測された出力から復元される可能性があり、パスワード、セッション トークン、API キー、または攻撃者が出力を推測することで損害を与える可能性のある値を生成するために使用すべきではありません。ブラウザでセキュリティに配慮したアプリケーションを使用する場合は、オペレーティングシステムの CSPRNG によってサポートされている Web Crypto API のcrypto.getRandomValues()を使用してください。
乱数発生器は本当に予測不可能になり得るのだろうか?
光子の到着時間や量子真空のゆらぎといった量子現象を利用したハードウェアベースの真性乱数発生器(TRNG)は、量子力学によれば根本的に予測不可能であると考えられています。つまり、いかなるアルゴリズムや追加情報を用いても、観測者がその出力を偶然以上の精度で予測することはできません。擬似乱数発生器(PRNG)やほとんどのソフトウェア型暗号擬似乱数発生器(CSPRNG)は、標準的な暗号理論の仮定の下では計算上予測不可能です。つまり、実際には安全ですが、絶対的な物理的意味では証明可能なほど予測不可能ではありません。
シード値は乱数発生器にどのような影響を与えるのでしょうか?
シードとは、擬似乱数生成器(PRNG)アルゴリズムに入力される初期値のことです。同じシードを使用すれば常に同じ数列が生成されるため、科学計算においては実験の再現性を確保できるという利点があります。しかし、現在の秒数だけをエントロピー源として使用するなど、不適切なシードを使用すると、攻撃者が考えられるすべてのシードを列挙できてしまうため、実効的な乱数性が大幅に低下します。適切なシード設定では、ナノ秒単位の現在時刻、プロセスID、メモリアドレス、および/dev/urandomやWindowsのCryptGenRandomなど、OSが提供するエントロピー源を組み合わせます。
Pythonのrandomモジュールは、どのような乱数生成器を使用していますか?
Pythonのrandomモジュールは、周期が2¹⁹⁹⁷⁻¹のメルセンヌ・ツイスターアルゴリズム(MT19937)を使用しており、ほとんどの統計的テストに合格します。シミュレーション、ゲーム、統計的サンプリングに適しています。ただし、暗号学的に安全ではありません。624個の連続した32ビット出力を観測すれば、内部状態を復元できてしまいます。Pythonでセキュリティが重要な作業を行う場合は、 os.urandom()を基盤とし、OSレベルのCSPRNGから乱数を生成するsecretsモジュールを使用してください。
コンピューターを使わずに乱数を生成するにはどうすればよいか?
コンピュータが登場する以前は、乱数は物理的な方法で生成されていました。例えば、サイコロを振ったり、回転するドラムから番号付きのボールを引いたり、コインを投げたり、カードをシャッフルしたりといった方法です。ランド研究所は1955年に、電子ルーレットで生成された10万個の正規偏差を含む100万個の乱数という有名な書籍を出版しました。乱数の統計表は、調査サンプリングや臨床試験で広く使用されていました。今日でも、一部の規制された宝くじや教室でのデモンストレーションでは手動の方法が使われていますが、電子的な方法に比べて時間がかかり、監査も困難です。
乱数発生器はなぜテストする必要があるのでしょうか?
ランダムに見える出力を生成するように設計されたアルゴリズムであっても、微妙な偏り、特定の次元における短い周期、あるいは連続する値間の相関関係など、一見しただけでは気づかないものの統計的検定で検出できる欠陥が含まれている可能性があります。これらの欠陥は、シミュレーション結果を無効にしたり、暗号システムのセキュリティを低下させたり、ゲームや宝くじに不公平をもたらしたりする可能性があります。NIST SP 800-22、BigCrush、PractRandなどのテストスイートを使用することで、これらの問題をデプロイ前に検出できます。PHPのmt_rand()の初期バージョンや2008年のDebian OpenSSLのバグなど、欠陥のある乱数生成器の過去の事例は、テストされていない乱数生成器が実際のセキュリティ障害を引き起こす可能性があることを示しています。
暗号学的に安全な擬似乱数発生器(CSPRNG)とは何ですか?
CSPRNGは、統計的品質に加えて、次のビットテスト(すべての前のビットが与えられた場合、どのアルゴリズムも次のビットを50%より有意に高い確率で予測できない)と状態侵害拡張耐性(攻撃者が時刻Tにおける内部状態を知った場合、Tより前の出力を再構築できない)という2つの追加のセキュリティ要件を満たすPRNGです。最新のCSPRNGには、ChaCha20ベースのジェネレータ(Linuxカーネル4.8以降、/dev/urandomで使用)、Fortuna(macOSおよびiOSで使用)、CTR_DRBG(NISTがSP 800-90Aで標準化)などがあります。
乱数発生器は重複する値を生成することがありますか?
はい、これは想定される動作です。真のランダムなプロセスは過去の出力を記憶しないため、重複は自然に発生します。これは確率論における誕生日問題で説明されます。1からNまでの均一な抽出では、およそ√N個の値が抽出された時点で重複が発生する可能性が高くなります。アプリケーションで一意の値が必要な場合(一意のIDを割り当てたり、重複のないカードのデッキをシャッフルしたりする場合など)、衝突を回避するために生の乱数生成器の出力に頼るのではなく、フィッシャー・イェーツなどのシャッフルアルゴリズムを定義済みのセットに適用するか、既に使用した値のセットを保持して重複を拒否するようにしてください。
オンライン宝くじや懸賞抽選ツールは、どのように公平性を確保しているのでしょうか?
信頼できるオンライン抽選ツールは、以下の要素を組み合わせることで公平性を確保しています。高品質のエントロピー源(理想的にはMath.random()ではなくTRNG)の使用、抽選前にアルゴリズムとシードを公開して結果を独立して検証できるようにすること、抽選終了前に番号が生成されたことを証明する署名付き乱数証明書の提供、独立監査人の立ち会いのもとでの抽選の実施。RANDOM.ORGは、各抽選にタイムスタンプと暗号署名を行い、監査可能な記録を作成するサードパーティ抽選サービスを提供しています。規制対象の宝くじの場合、国のゲーム当局は、システムが稼働する前に、認定されたハードウェアRNGと独立した試験機関の承認を要求します。
Stop doing SEO by hand
Put your SEO on autopilot — your first 3 articles for $1
Auto SEO scans your site, builds a content plan, and writes ranking-ready articles automatically. Start your $1 trial — the AI writes your first 3 the moment you begin. Cancel anytime in 3 days.
2,147+ businesses · Cancel anytime · No lock-in