web-dev-qa-db-ja.com

真に乱数を生成することがなぜ不可能なのですか?

100万の乱数を生成する必要がある趣味の問題を解決しようとしていました。しかし、すぐに気づき、それらをユニークにすることは困難になりつつあります。乱数の生成について読むために Algorithm Design Manual をピックアップしました。

それは私が完全に理解することができない次の段落があります。

残念ながら、乱数の生成は実際よりもずっと簡単に見えます。実際、決定論的なデバイスで真に乱数を生成することは基本的に不可能です。フォンノイマン[Neu63]はそれを最もよく述べています。私たちが期待できる最高のものは、疑似乱数、つまりランダムに生成されたかのように見える一連の数字です。

決定論的なデバイスで真に乱数を生成することが不可能であるのはなぜですか?この文はどういう意味ですか?

48

暗号的に安全な疑似乱数ジェネレータ を探す必要があります。ほとんどのPRNGは線形合同ジェネレーターです(つまりnext numberprevious numberの線形関数です)。したがって、next numberprevious numberをプロットすると平行線のグラフを取得します。CSPRNGはそれを行いません。トレードオフは、それらが遅いことです。

乱数ジェネレータを つのカテゴリ にグループ化します。

  1. 宿題には十分です。
  2. あなたの会社を賭けるのに十分良い。
  3. あなたの国を賭けるのに十分良い。

決定論的なデバイスで真に乱数を生成することが不可能であるのはなぜですか?

決定論的デバイスは、同じ開始条件と入力が与えられた場合、常に同じ出力を生成します-これがdeterministicであることの意味です。 「真の乱数」は、哲学的な見方に近いものです。randomとは、哲学的なへその注視の核心であるということです(原子の崩壊がランダムであるか、または何らかのパターンに従っているかどうかは、人々にはわかりません。まだわかりません)。暗号化された安全な乱数ジェネレーターは、エントロピーの外部ソースを使用して、デバイスを非決定性にします。

65
Tangurena

真のランダム性は非決定性を意味します。それが決定論的である場合、それは正確に予測することができます(これが決定論が意味するものです)。予測できる場合はランダムではありません。

確定的な疑似乱数ジェネレーターから取得できる最良のことは、非常に長いサイクル(RNGデバイスに無制限のストレージがない限り、繰り返せないことは不可能です)を備えた数値のストリームであり、サイクルの長さに対して、ランダムシーケンスの他のすべてのプロパティを満たすストリーム番号(値の均一な分布が最も興味深いものです)。

この問題を解決するために、多くの最近のUNIXおよびUnixライクには、物理​​的なノイズソースを使用して真のランダム性を生成するカーネルRNGがあります。

別の一般的なアプローチは、現在の時間を決定論的RNGのシードとして使用することです(srand(time(NULL)); in C);暗号的に言えば、現在の時間は秘密ではないので、これは価値がありませんが、物理シミュレーションやビデオゲームのようなものには十分です。

22
tdammers

本の第2章Discrete-Event Simulation:A First Course by Lawrence Leemisは、乱数ジェネレーター(より正確には、疑似乱数ジェネレーター)の素晴らしい紹介をしています。

彼の本からの抜粋は、私の意見ではそれをよく説明しています:

歴史的に、計算アプリケーションには3つのタイプの乱数ジェネレーターが推奨されています。(a)1950年代スタイルのテーブルルックアップジェネレーター。 (b)たとえば、熱「ホワイトノイズ」デバイスなどのハードウェアジェネレータ。 (c)アルゴリズム(ソフトウェア)ジェネレーター。これら3つのタイプのうち、アルゴリズムジェネレーターのみが広く受け入れられています。この理由は、アルゴリズムジェネレーターだけが、次の一般的に受け入れられている乱数生成基準のすべてを満たす可能性があるためです。ジェネレーターは:

  • ランダム-ランダム性のすべての合理的な統計テストに合格する出力を生成できます。
  • 制御可能-必要に応じて、その出力を再現できます。
  • ポータブル-さまざまなコンピューターシステムで同じ出力を生成できます。
  • 効率的-高速、最小限のコンピューターリソース要件。
  • 文書化-理論的に分析され、広範囲にわたってテストされています。

したがって、ホワイトノイズジェネレータを使用して「より良い」乱数を取得することは可能ですが、それらは上記の基準のほとんどに従っていないため、受け入れられていません。

その本のコピー(または同様のもの)を手に入れることをお勧めします。 PRNGの作業がどのように行われるかを正確に理解することは、間違いなくあなたの努力を助けるでしょう。

10
riwalk

乱数を生成するコードを記述する必要があり、コードは[〜#〜] not [〜#〜]ランダムであるためです。 (それは確定的です)

したがって、「ランダム」(通常は現在のタイムスタンプ)で選択された「シード値」から始めて、それをアルゴリズムで使用して数値の生成を開始します。しかし、全体のセットは元のSeed値に基づいています!

したがって、まったく同じSeed value(s))を使用してコードを再度実行すると、まったく同じ数値のセットが得られます!合理的に人がそれを呼び出す方法ランダム?しかし、確かに[〜#〜] look [〜#〜]ランダムです。


それらを一意にすることに関しては、番号を生成した後、その番号をすでに持っているかどうかを確認し、持っている場合は捨てて新しい番号を生成します。

7
Morons

乱数を生成しているので、生成された値は一意ではないことが予想されます。これはランダム性の特性です。真にランダムな(または疑似ランダムな)数値のシーケンスが一意であるとは言えません。その要件により、範囲内の最終値を予測できるだけでなく、新しい番号が選択されるたびに、選択されていないすべての番号。

5
James McLeod

私はPseudo Randomの非常に単純な定義を持っています:

予測する未知の変数が多すぎます

True Randomの簡単な定義もあります。

無限の未知の変数

コンピュータの問題は、常にすべての変数を知っていることです。乱数は、いくつかのシード値の数学関数です。
最善の方法は、コンピューターに疑似ランダムシード値を与えることです。これは、通常、予測できない変数(正確な時間など)に基づいています。

コンピュータが乱数を作成することは絶対に不可能ですが、あまりにも多くの変数を導入して予測することは得意です!

5
Scott Rippey

真の乱数の生成ソフトウェアは他の人が指摘したように実際には不可能ですが、真の乱数を生成できるデバイスをハードウェアで構築することは可能です*。これはインターネット上にかなりの数の例があり、ガイガーカウンターのティック間の時間の読み取りから、未調整の受信機のホワイトノイズ(主に宇宙からのバックグラウンド放射)のサンプリングまで、さまざまな方法が使用されています。私自身は いくつか作成 使用可能なメソッドのいくつかを使用しています。

*優れた物理学のマニアなら誰でも、宇宙の操作方法を考えると、これらはいずれも超技術的で真にランダムではないが、合理的結果を予測する方法なので、この議論のためには十分です。

3
Unkwntech

決定論は本質的に関数です。代数から、関数はドメインと範囲の間の対応であり、ドメインの各メンバーが範囲の正確に1つのメンバーに対応することを覚えておいてください。

つまり、f(x) = zの場合、f(x)!= yはyがzでない限り、それは関数です。JavaScriptを想像してみてください。

_function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5
_

Add(2,3)を何度呼び出しても、常に5を返します。つまり、Add()は確定的な関数です。

外部要因により、Addが非決定的な方法で動作する可能性があります。たとえば、方程式にマルチスレッドを導入するとします。人間の入力も非決定性を引き起こします。

さて、ここが面白いところです。

「ランダムな数字を生成する算術的な方法を検討している人は、もちろん、罪の状態にあります。」

フォン・ノイマンは、「生成の算術的方法[...]」と述べていることに注意してください。これは、人間の入力、同時実行、精密計器から読み取られたサンプル風速、または決定論的関数へのランダムinputを生成する非アルゴリズム的な方法について話しているのではありません。

これは単に、関数または関数のシステムが突然非決定性になることはないことを示しています。言い換えると、Add(2,3)は6や5以外の何かを返すことはありません同じ入力が与えられた場合。それは不可能です。

引用著者はそれをさらに一歩進めます。

私たちが期待できる最高のものは、疑似乱数、つまりランダムに生成されたかのように見える一連の数字です。

コンテキストは、「任意の確定的デバイス上」であると以前に定義されています。私はここで議論を終えることができました。しかし、システムに新しい要素を導入してコンテキストを変更するとどうなるでしょうか。入力として追加された非決定論的な要素は、システムを非決定論的なシステムにします。ただし、非決定論的な要素を削除することで、決定論的なシステムに戻ります。入力を何らかの形で追跡または再現できる場合は、結果を再現できます。しかし、この段落全体は、著者が言っていることと一致しています。コンテキストを覚えておいてください。

非決定論の意味について議論することができます。もう一度、タンジェニアル。コンテキストを覚えておいてください。

だから彼は正しいです。 任意の確定的デバイス上確定的システムが真のランダムな結果を生成することは不可能です。

2
P.Brian.Mackey

特別なハードウェアなしで乱数を生成する方法はありません。私の新入生の年に、クラスメートのカップルと私は、基本的にAMレシーバーと4つの異なるチャネルに調整された乱数ジェネレーターを提案し、AからDコンバーターに入力を取得し、それらすべてを追加します(最大数を法として)。任意の数のステーションからのアナログ入力の組み合わせはランダムであり、A2Dコンバーターから多数の乱数を生成できるため、これは優れたジェネレーターになる可能性があると提案しました。もちろん、これは哲学的な意味で真にランダムではありませんが、ほとんどの実際的な目的ではこれでうまくいきます。

2