web-dev-qa-db-ja.com

なぜ「(疑似)乱数発生器の期間」が重要なのですか?

私はさまざまなソースからの(疑似)乱数発生器コードを理解しようと努めてきましたが、ピリオドの概念は私から逃れ続けています。理解の最小レベルを満たすために、統計からの「サンプルサイズ」の観点から考えてみました。

しかし、私の理解は過度に単純化しすぎているのではないかと思います。ピリオドを許可する(または必要とする)関数/呼び出しについて私が見つけたドキュメントは、値が重要であるが、理由を説明する際に横ばいであることを示しています...

プログラマーが(擬似)乱数ジェネレーターの期間を設定できる場合、適切な(最適または望ましい)期間を定義するものとその理由

さらに(集中的な理解のために):-素数を使用して期間を定義することは重要(または役立つ)ですか? -長い期間または短い期間は、より望ましい出力を生成しますか?

6
Wermske

コンピュータはnotチューリングマシンです。それらは決定論的有限状態機械です。

チューリングマシンには無限のメモリがあり、コンピューターには有限のメモリがあります。チューリングマシンには任意の数の(有限ではありますが)状態がありますが、コンピューターには任意の数の状態を含めることはできません。 8 * 2のみ1024 + 4 * 28 =〜10300 異なる状態)。

プログラム自体もメモリに格納されているため、それ自体が状態の一部です。 Any十分に長く実行されるプログラムmustある時点で、以前にあった状態になってしまいます。そして、プログラム自体は状態の一部であり、コンピューターは決定論的であるため、これは前回この状態にあったときに行ったのとまったく同じことを実行し、最終的には同じフォローアップ状態になります前回、つまり、今と同じことを行うようになります。 Any十分に長く実行されるプログラムは、ある時点で以前の状態になり、その時点から前回とまったく同じように実行されます。

プログラムが繰り返し開始するこのステップの長さをピリオドと呼びます。 Everyプログラムには、疑似乱数ジェネレータだけではなく、1つあります。

ほとんどの場合、これらの期間は理論上のものであることに注意してください。上記の1 Kバイトのコンピュータに5 THzのCPUが搭載されている場合でも、10270 宇宙の現在の年齢の10倍300 状態。

ただし、ほとんどのプログラム、そして確かにほとんどのPRNGは、コンピュータのメモリ全体を自分の状態だけに使用するわけではありません。 (特に、PRNGは通常、はるかに大きなプログラムに埋め込まれているため、それらからメモリを「盗む」必要があります。)さらに、プログラムはすべての可能な状態を完全に循環するわけではなく、通常、はるかに少数の状態しかありません。期間の長さは、内部状態の数より長くなることはなく、通常は短くなります。不適切に設計されたPRNGの場合、それはway短くなります。

RANDU PRNG Scientific Subroutine LibraryのIBM System/360で使用され、他のメインフレームに移植されたものは、何十年にもわたって研究、シミュ​​レーション、統計などで使用されていました。その他の主要な欠陥、たとえば、奇数の整数しか生成できず、偶数の整数も生成できない)期間が229日。つまり、約100億ステップを実行しただけで、次の数値がわかります正確に。 (シーケンス全体を格納するのに必要なのは約40 GBのみです!)オンラインブラックジャックをプレイすると、これから登場するすべてのカードがわかり、オンラインルーレットをプレイすると、次に何番目になるかがわかります。

プログラマーが(疑似)乱数ジェネレーターの期間を設定できる場合

一般的にはそうではありません。期間の長さはアルゴリズムのプロパティです。期間の長さに影響する内部状態のサイズを選択できるいくつかのアルゴリズムがあります。

良い(最適または望ましい)期間を定義するもの

長いです。長いほど良い。

どのぐらいの間?まあ、皮肉にも言えば、それを保存するのに十分なハードディスクを購入するのがシステムの他の部分を攻撃するよりも高価になるほど長い間です(たとえば、カジノのデータセンター管理人に賄賂を渡して、プレイヤーのカードを送信するサーバーにバックドアをインストールしてインストールします)。

なぜ?

私はそれが今明白であることを望みます。 PRNG短いピリオド(たとえば5)を使用すると、同じ5の数値が何度も繰り返されます。これは「ランダム」ではありません。

19
Jörg W Mittag

他の答えはいくつかの良い理論を提供しますが、実用的なアプリケーションの一部が欠けています。

プログラマーが(疑似)乱数ジェネレーターの期間を設定できる場合

通常は設定できません。これはジェネレータ関数のプロパティです。別の期間が必要ですか?別の機能(またはバリエーション)を選択する

良い(最適または望ましい)期間を定義するものとその理由

一般的に、期間はできるだけ長くする必要があります。実際のエントロピーを使用する真のRNGには期間がなく、これらは特定のアプリケーションに最適です。

期間が長いほど、繰り返されるまでの時間が短くなります。 PRNGが間違ったタイミングで繰り返される場合、それはユーザーに見える異常として現れる可能性があります(たとえば、同じデッキの順序を使用してカードゲームを扱う)。これは望ましい場合があります。たとえば、1つ可能性がある 同じ生成された世界をチェックアウトするためにMinecraftのシードを他の人に与える (Minecraftの場合、技術的にはほぼ同じですが、受け入れられた回答が指摘しています)場合によっては、そうではありません:暗号化アプリケーションは繰り返されるPRNGに特に敏感です これがエントロピーも含める傾向がある理由です

PRNGは、その内部状態を保持するために使用される変数のサイズによって必然的に制限されます。受け入れられた回答が言うように、PRNGの現在の状態は次の状態を定義します。これは本質的に有限状態オートマトンですここでは、(通常)初期状態(シード)およびを選択できます。状態は1つの大きなループです。 pigeonholeの原則 を使用します内部状態がたとえば32ビットである場合、PRNGの周期には上限2があることを証明できます。32 ユニークな状態。実際の期間はより低い可能性が高いことに注意してください。状態は単に理論的な上限を定義するだけです。

実際には、次の方法を使用して、有効期間を増やしたり、期間が繰り返されたときに発生する可能性のある損傷を減らしたりすることが可能であり、ますます一般的になっています。

  • PRNGのユーザーが必要とするよりも大きな内部状態を使用し、数値の一部のみを返します。たとえば、32ビット整数が必要な場合は、内部で64ビット状態を使用して、各数値の下位32ビット。同じ32ビット整数が複数回返される場合があります。ただし、actual内部状態が異なります。例:

    内部状態:0100 01100110を返します。

    内部状態:0011 01100110を返します。

    これは、有名な長い期間を持っている Mersenne Twister によって採用されている戦略の一部です(ただし、考慮すべき特定の欠点があります)。

  • 複数の値を使用して単一の数値を生成します。これは、データを「正規化」するために一部の「実際の」エントロピーベースのジェネレーターで採用されている戦略です。例:2進数のストリームが与えられた場合、異なるペアを破棄し、一致する連続した数字のみを使用します。

    10 01 11 00 10 00 01 1111 00 00 11になり、同様の数字が結合されて、クワッド1001になります。

    抽出されるデータによっては、期間が繰り返されるときに値が再利用されるため、値の意味が変わり、事実上別の値になります。これは、エントロピーベースのRNGよりもPRNGにはあまり役立ちませんが、状態をビットストリームとして扱うことは依然として可能です。これにより、使用する戦略と取得したデータに応じて、有効期間が長くなる可能性があります。

  • 同じ値が繰り返されるときに別の方法で処理されると、期間が繰り返されたという事実を隠すことができます。これは、JavaのJava.util.Randomクラスの動作に似ています。値が最初に64ビットの整数として取得され、次に32ビットの整数として取得される場合、実際に繰り返されることは誰にもわかりません。 64ビットの内部状態を想定してこれを機能させる方法の例:

    • 64ビット整数が要求された場合、内部状態を返すだけです。
    • より短い整数が要求された場合、一部のビットをマスクするか、それらを結合します。おそらく、32ビットの値は、XOR 64ビットの値の両方を半分にしたものです。
    • ブール値が要求された場合、すべてのビットを使用して値を決定する手法を適用します(たとえば、設定されたビットの偶数がfalse、奇数がtrue)。
    • 浮動小数点値は、ビットパターンの IEEE 754 制約が原因で扱いにくい場合がありますが、ランダムなビットを使用してランダムな値を取得する方法があります。
  • 制限された値(1から100までの整数を指定するなど)が必要な場合は、タスクがさらに簡単になります。単純なモジュロ演算ではバイアスが発生する可能性がありますが、より多くのビットを使用して値を均等に分配する手法を適用できます。同じ状態が2回使用されたが、異なる間隔で分散された場合、異なる数値が返される可能性があります。

  • 値を返すときにエントロピーを含めます。同じ内部状態を維持しますが、PRNGから値を返すときに、コンピューターのCPUの内部温度などの非決定的なものを表すバイナリデータと小数点以下の桁数を組み合わせることもできます。多分同じことをしますが、個々のCPUティックを測定するより正確な内部クロックを使用します。これは、PRNGが何であるかということの端にあります。技術的には、ハイブリッドアプローチに近いものですが、PRNGをシードするために、そもそも同様の戦術が使用されます。

1
user22815

PRNGを使用してお気に入りのプログラムを作成します。

次に、PRNGの期間が非常に短くなった場合(100など)にどうなるかを想像してください。

もちろんそれはプログラムに依存しますが、弱いPRNGを暗号化に使用する場合、攻撃者は周期性に簡単に気づき、最終的に秘密のメッセージを解読することができます。 PRNGモンテカルロシミュレーションの場合、シミュレーションを長時間実行しても、短時間実行するだけでは何もわかりません。

私はPRNGの専門家ではありませんが、通常、期間は一部の調整可能なパラメータではありません。ただし、PRNGを選択でき、一部のPRNG Give(inそれらのドキュメント)期間に関するいくつかの約束(または期待)。通常、PRNG期間が長いほど状態が大きくなるため、速度が遅くなります。したがって、トレードオフがあります。