罪の引用におけるフォン・ノイマンのランダム性はもはや適用できませんか?


25

ある人は次のように言った:

決定論的な手段で乱数を生成しようとする人は、もちろん罪の状態に住んでいます。

これは常に、コンピューターだけでは真の乱数を生成できないことを意味します。そして彼は、コンピューターが単一のIntel 8080マイクロプロセッサーと同等のサイズ(約6000バルブ)だったと言いました。コンピューターはより複雑になり、フォン・フォン・ノイマンの声明はもはや真実ではないと思う。実装されたソフトウェアのみのアルゴリズムは不可能であることを考慮してください。これらは物理ハードウェア上で実行されます。真の乱数ジェネレーターとそのエントロピーソースもハードウェアで構成されています。

このJavaフラグメントはループに入れられます。

      file.writeByte((byte) (System.nanoTime() & 0xff));

画像として表したデータファイルを作成できます。

ナノイメージ

構造を見ることができますが、同様に多くのランダム性があります。興味深いのは、このPNGファイルのサイズは232KBですが、250,000のグレースケールピクセルが含まれていることです。PNG圧縮レベルは最大でした。つまり、圧縮率は7%だけです。かなり非圧縮性。また興味深いのは、ファイルが一意であることです。このファイルのすべての世代はわずかに異なるパターンであり、圧縮率は約7%です。 私の主張にとって重要であるため、これを強調します。これはバイトあたり約7ビットのエントロピーです。もちろん、より強力な圧縮アルゴリズムを使用すると削減されます。ただし、0ビット/バイトに近い値に減らさないでください。上記の画像を撮影し、そのカラーマップをランダムな画像に置き換えることで、より良い印象を得ることができます。

ランダム化されたナノイメージ

構造のほとんど(上半分)は、類似しているがわずかに異なる値のシーケンスであるため、消えます。これは、マルチテイキングオペレーティングシステムでJavaプログラムを実行するだけで作成される真のエントロピーソースですか?一様に分布した乱数ジェネレータではなく、1つのエントロピーソースですか?たまたまPCである物理ハードウェアで実行されるソフトウェアで構築されたエントロピーソース。

補足

すべてに共通の固定パターンなしですべての画像が新鮮なエントロピーを生成することを確認するために、10個の連続した画像が生成されました。次に、これらを連結し、私がコンパイルできる最強のアーカイバ(paq8px)で圧縮しました。このプロセスは、変更/エントロピーのみを残す自動相関を含む、すべての一般的なデータを削除します。

連結されたファイルは〜66%に圧縮されており、エントロピー率は〜5.3ビット/バイトまたは10.5Mbits / imageになります。驚くべき量のエントロピー

補足2

圧縮テストの方法論によるエントロピーに欠陥があるという否定的なコメントがあり、緩やかな上限推定値を示しているだけです。NISTの公式暗号エントロピー評価テストSP800-90B_EntropyAssessmentを使用して、連結ファイルを実行しました。これは、非IIDエントロピー測定の場合と同じくらい良好です。これはレポートです(この質問は長くなっていますが、問題は複雑です):

Running non-IID tests...

Entropic statistic estimates:
Most Common Value Estimate = 7.88411
Collision Test Estimate = 6.44961
Markov Test Estimate = 5.61735
Compression Test Estimate = 6.65691
t-Tuple Test Estimate = 7.40114
Longest Reapeated Substring Test Estimate = 8.00305

Predictor estimates:
Multi Most Common in Window (MultiMCW) Test: 100% complete
    Correct: 3816
    P_avg (global): 0.00397508
    P_run (local): 0.00216675
Multi Most Common in Window (Multi MCW) Test = 7.9748
Lag 

Test: 100% complete
    Correct: 3974
    P_avg (global): 0.00413607
    P_run (local): 0.00216675
Lag Prediction Test = 7.91752
MultiMMC Test: 100% complete
    Correct: 3913
    P_avg (global): 0.00407383
    P_run (local): 0.00216675
Multi Markov Model with Counting (MultiMMC) Prediction Test = 7.9394
LZ78Y Test: 99% complete
    Correct: 3866
    P_avg (global): 0.00402593
    P_run (local): 0.00216675
LZ78Y Prediction Test = 7.95646
Min Entropy: 5.61735

その結果、NISTは、5.6ビット/バイトのエントロピーを生成したと考えています。私のDIY圧縮の見積もりでは、これは5.3ビット/バイトで、やや保守的です。

->ソフトウェアを実行しているコンピューターが実際のエントロピーを生成できるという概念を裏付けているようです。そして、そのフォン・ノイマンは間違っていた(しかしおそらく彼の時代には正しい)。


私の主張を裏付けるかもしれない以下の参考文献を提供します:-

プログラムの実行速度に非決定性の確率モデルはありますか?

確率的ハードリアルタイムシステムのWCET分析

非決定的カオスパターンを生成できるソフトウェアアルゴリズムはありますか?カオス効果の関連性。

Parallelsの量子エントロピー不確定性原理

nanoTime()のカオス的挙動に関するAlekseyShipilёvのブログエントリ。彼の散布図は私のものと似ていません。


47
「パターンが見えない」/毎日のランダム性と数学的/確率的ランダム性を間違えていると思います。
ラファエル

3
@Raphaelしません。数学的圧縮アルゴリズムが行います。また、すべてのソフトウェアが常に決定的である場合、リアルタイムオペレーティングシステムのポイントは何ですか?私は、ビットの観点から不確定性について質問しています。
ポールUszak

16
「コンピューター上」と「決定論的手段で」を融合している。
user253751

24
ここでの基本的な問題は、「このパターンがどのように生成されるか理解していない」から始めて、「このパターンがどのように生成されるかを誰も理解できない」と結論付けることです。これは正しくありません。SEプロファイルを使用すると、暗号化に十分精通しているため、暗号化が実行されないことがわかります。あなたが破ることができないシステムを考案することは簡単ですが、本当の課題は、他の人も破ることができないシステムを考案することです。
ジル 'SO-悪であるのをやめる'

4
「決定論的」の定義のほとんどは、を呼び出すアルゴリズムを除外すると思いますSystem.nanoTime()
bmm6o

回答:


75

パターンが見えないからといって、パターンが存在しないわけではありません。圧縮アルゴリズムがパターンを見つけられないからといって、パターンが存在しないという意味ではありません。圧縮アルゴリズムは、ソースの真のエントロピーを魔法のように測定できる特効薬ではありません。彼らがあなたに与えるのは、エントロピーの量の上限だけです。(同様に、NISTテストでは上限のみが与えられます。)カオスはランダムではありません。

この方法で得られたランダム性の品質についてある程度の信頼を得るには、より詳細な分析と検査が必要です。

クロックジッタと2つのハードウェアクロック間のドリフトを利用することで、ある程度のランダム性を得ることができると考える理由があります、それは繊細でトリッキーなので、注意する必要があります。自分で実装することはお勧めしません。代わりに、高品質のエントロピーソース(通常、最新のオペレーティングシステムに実装されている)を使用することをお勧めします。詳細については、Wikipediahaveged、および/crypto//q/48302/351もご覧ください(既に認識しているようです)。

最後に、オープナーに関するコメント:

「決定論的手段で乱数を生成しようとする人は、もちろん罪の状態に住んでいます。」

これは常に、コンピューターだけでは真の乱数を生成できないことを意味します。

いいえ、それは通常どのようにとられるかではなく、それが言っていることでもありません。決定論的手段では真の乱数を生成できないと言っています。コンピューターで実行できるかどうかは、コンピューターが決定論的かどうかによって異なります。コンピューターが確定的である場合、またはプログラムが確定的操作のみを使用している場合は、できません。ただし、多くのコンピューターには非決定的な要素が含まれており、プログラムでそれらを使用する場合、それらを使用して乱数を生成できるかどうかを判断するには、より詳細な分析が必要です。あなたの場合nanoTime()、非決定的です。


6
圧縮アルゴリズムのポイントを拡張するために、PNGは、ほとんどの圧縮アルゴリズムと同様に、データ内のパターンを探します。データの変化のパターンを探すアルゴリズムは、サンプル画像を非常にうまく圧縮する可能性があります。
マーク

1
@Mark-実際には、PNG 変更のパターンを分析します(実際のピクセル値と、画像に既に見られる変更の種類に基づくいくつかの予測ヒューリスティックのいずれかの出力との差に適用される圧縮圧縮を使用します)ただし、実行される分析は、90年代に組み込みデバイスで効率的に実行できるように設計されていたため、非常に単純です。さらに興味深い質問は、非可逆圧縮アルゴリズムがどれほど正確か、たとえば、JPEGのRMSエラーや画像に適用される何らかのフラクタル圧縮はどれくらいかということです。
ジュール

3
@Jules:重要なのは、PNGが単純であるということではなく、多くの種類の画像に表示される可能性のある種類のパターンを圧縮するように設計されていることです。たとえば、123x234ピクセルの典型的な写真を撮って、ピクセルを同じ順序に保ちながら234x123に変更する場合(したがって、新しい写真の最初の行には、古い写真の一番上の行から123ピクセル、さらに2行目、新しい画像の次の行には、元の2行目の最後の12ピクセル、元の3行目のすべて、4行目の99などが含まれます。PNGは...
supercat

1
... 2番目の画像にはまったく同じ順序で、まったく同じピクセルが含まれるという事実にもかかわらず、行間に同じ空間関係が存在しなくなるため、結果の画像を元の画像とほとんど同じように圧縮しない可能性が高い最初。
-supercat

100

エントロピー/ランダム性のハードウェアソースを使用している場合、「決定論的な手段でランダム性を生成しようとする」ことはしません(私の強調)。エントロピー/ランダム性のハードウェアソースを使用していない場合、より強力なコンピューターは、1秒あたりの罪を犯せることを意味します。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
DW

20

決定論的アルゴリズムのエントロピーの量は一定であり、出力は「ランダム」に見えますが、入力が提供するよりも多くのエントロピーを含めることはできないことを意味するという引用を常に理解しています。この観点から、あなたのアルゴリズムはエントロピーを密輸することがわかりますSystem.nanoTime()-「決定論的」アルゴリズムのほとんどの定義はこの関数の呼び出しを許可しません。

引用は、簡潔ですが、本質的にはトートロジーです。反論するものは何もありませんし、それをもはや真実にすることができるハードウェアの進化もありません。ハードウェアではなく、決定論的アルゴリズムの定義に関するものです。彼は単に、決定論とランダム性が両立しないことを観察しています。決定論的アルゴリズムの場合、その全体の動作は開始条件によって予測されます。例外を見つけたと思うなら、それは決定論的であることの意味を誤解しています。

複雑な一連のキャッシュを備えた共有コンピューターで実行され、さまざまなネットワークおよびハードウェアの入力を受け取るプロセスは、単純な分離された専用ハードウェアで実行されるプロセスよりもはるかに多くのエントロピーにアクセスできます。しかし、そのプロセスがそのエントロピーにアクセスする場合、それはもはや決定論的ではないため、引用は適用されません。


リフレクション(Javaタイプではない)では、nanoTime()が必要かどうかわかりません。これは、それを取り巻くループの進行状況を追跡するためのersatzストップウォッチにすぎませんでした。nanoTime()が削除された場合、ループの実行速度(ハードウェアへの直接呼び出しなし)も、コンピューターの環境と対話するソフトウェアであるため、非決定的であると考えています。これが、組み込みキットでのリアルタイムプログラミングの基礎です。フォン・ノイマンの引用はもはや現代のコンピューターには当てはまらないと確信しています。
ポールUszak

1
@PaulUszakこれを何回言わなければならないのですか?フォン・ノイマンは、乱数を決定論的に生成することはできないと言います。あなたは非決定論を使うことができるので、フォン・ノイマンは間違っていると言い続けます。「パリからベルリンまで歩くのに非常に長い時間がかかる」という言葉は、現代の世界には当てはまらないと繰り返し主張しているようです。これらの2つの都市間を飛行できるからです。だから何?引用はウォーキングに関するもので、それでもまだ時間がかかります。フォン・ノイマンの引用は決定論的なシステムに関するものであり、それでもランダムに動作することはできません。
デビッドリチャービー

1
@PaulUszakそれは文字通り不可能です。動作が入力によって決定されない決定論的アルゴリズムがあると思う場合、エントロピーが導入されている場所を識別するだけの問題です。
bmm6o

18

決定論的な手段で乱数を生成しようとする人は、もちろん罪の状態に住んでいます。

「罪の状態で生きる」と「ナンセンスをする」と解釈するとき、それは完全に正しいです。

あなたがしたことは、かなり遅い方法System.nanoTime()を使用して、かなり弱いランダム性を生成することです。あなたはいくつかを測定しました

...〜5.3ビット/バイトのエントロピーレート...

しかし、これは単なる上限です。取得できるのは上限のみです。実際のエントロピーは数桁小さくなります。

代わりに、MD5などの暗号化ハッシュを使用して配列を埋めてみてください。次のようなシーケンスを計算しますmd5(0), md5(1), ...(1バイト以上の各値から、これは重要ではありません)圧縮はまったく得られません(はい、MD5は壊れていますが、それでも非圧縮データを生成するには十分です)。

エントロピーはまったくないが、8ビット/バイトを測定すると言うことができます。

本当にランダムなものが必要な場合は、HWソースを使用する必要があるだけでなく、エントロピーが実際どれだけ生成するかについての確実な下限も知る必要があります。にランダム性がある可能性が最も高いのですが、そのnanoTime()上に重要な下限があることは知りません。

暗号化にランダム性が必要な場合、OS、言語、または優れたライブラリによって提供されるものに頼らなければなりません。そのようなプロバイダーは、複数のソースおよび/または専用のハードウェアからエントロピーを収集し、そのようなエントロピーの推定にはかなりの作業が行われています。

通常、エントロピーはほとんど必要ないことに注意してください。数個のランダムバイトで初期化された適切な(決定論的な)PRNGは、暗号化に使用できるため、他のすべてにも使用できます。


4
@PaulUszak確かに、確定的なPRNGはOTPとして使用できません。ただし、OTPは定義上、真にランダムなキーを必要とするため、非常に特殊なケースです。ランダムにシードされたセキュアなPRNGで十分です(シードには、必要なセキュリティレベルに応じて、たとえば128ビットまたは256ビットのエントロピーが必要です)。
maaartinus

3
「ランダムなものが本当に必要なとき」→基本的に真のランダム性は必要ありません。むしろ、相関関係の欠如が必要です。真のランダム性は強力な保証ですが、基本的にすべてのケースは最新のCSPRNGと予測不可能なシードによって同様に満足されます。
-Veedrac

3
@maaartinusあなたは私をまったく理解していません。真のランダムシードは不要で、予測できない無相関のシードが必要なだけです。
-Veedrac

6
例として、100万個の連続番号を持つテキストファイルを作成しました。gzipエントロピーがほとんどないにもかかわらず、63%の圧縮しか得られませんでした。次のような繰り返ししか検出できませんでした999919999299993...
Barmar

6
@PaulUszakそれが私のポイントでした-圧縮率はエントロピーの良い指標ではなく、特定の圧縮アルゴリズムがデータに含まれるパターンの種類を検出できるかどうかを示します。
バーマー

14

私は「ランダム」の意味に耳を傾けると思った。ここでのほとんどの答えは、決定論的プロセスの出力と比較した、ランダムプロセスの出力に関するものです。これは「ランダム」の完全に良い意味ですが、それだけではありません。

ランダムプロセスの出力に関する問題の1つは、それらが決定論的プロセスの出力と区別するのが難しいことです。それらには、ソースがどれほどランダムであるかの「レコード」が含まれていません。これの極端な例は、乱数ジェネレーターが常に戻る有名なXKCDコミック4、ダイスロールから来たためランダムであると主張するコードコメントが付いています。

コルモゴロフの複雑性と呼ばれる「ランダム性」を定義する別のアプローチは、データの生成方法に関係なく、データ自体に基づいています。一部のデータのコルモゴロフの複雑さ(数値のシーケンスなど)は、そのデータを出力する最短のコンピュータープログラムの長さです。コルモゴロフの複雑さがより高い場合、データは「よりランダム」です。

PNGなどの圧縮アルゴリズムの使用、および圧縮前後の長さの比較は、コルモゴロフの複雑さの概念に似ています。ただし、コルモゴロフの複雑さにより、PNGのような制限された形式ではなく、チューリング完全プログラミング言語でプログラムとしてデータをエンコードできます。このようなエンコード(プログラム)の「解凍」は、それらを実行することで行われます。これには、任意の時間とメモリが必要になる場合があります(たとえば、私たちの小さな宇宙で利用できる量以上)。

ライスの定理は、一般に、永久にループするプログラムとデータを出力するプログラムを区別できないことを示しています。そのため、一部のデータのコルモゴロフの複雑さを見つけるのは非常に困難です。そのデータを生成するプログラムを書き留めると、実際には短いプログラム(つまり、より低い複雑さ)があるかもしれませんが、無限ループと区別してください。したがって、Kolmogorovの複雑さは計算できませんが、Busy-Beaverの数値を知っていれば、それらを使用して各プログラムをチェックする時間を制限することで計算できます。

サンプルデータの場合、そのコルモゴロフの複雑さ(つまり「固有のランダム性」)を見つけるには、同じバイトシーケンスを出力する最短の決定論的プログラムを見つけ、その長さを取得する必要があります。

これで、コルモゴロフの複雑さの観点から質問に答えることができます。引用が正しいことがわかりました。決定論的な手段では乱数(高いコルモゴロフの複雑さ)を生成できません。

何故なの?小さなコンピュータープログラムを作成し、それを使用して乱数のシーケンスを生成するとします。次のいずれかの状況が当てはまる必要があります。

  • 膨大な量の出力を生成します。ただし、この出力は小さなプログラムによって生成されることがわかっているため、出力は(定義により)コルモゴロフの複雑さが低く、したがってこの意味では「ランダム」ではありません。
  • 生成する数値が非常に少ないので、それらをすべて書き留めるのに、短い生成プログラムを書き留めるのと同じか、さらに少ないビットで済みます。この場合、数値は比較的非圧縮性であり、コルモゴロフの意味で非常にランダムであることを示しています。出力の量は、我々は(プログラムのソースコード)に入れたものに匹敵するので、それの公正は、プログラムがランダム性を「生成」しなかったことを言って、私たちはそのプログラムを選択していました。結局のところ、この場合、生成プログラムはこれらの正確な数値のリスト(たとえばprint([...]))であったかもしれません。

どちらの場合でも、私たちが入れるよりも多くのランダム性を「生成」するわけではありません(生成プログラムのソースコードの「ランダム性」)。短いジェネレーターを持つ出力を回避するために、より長い生成プログラムを使用してこれを回避しようとするかもしれませんが、それを行う方法は2つしかありません。

  • 何らかの方法で体系的にコードを「膨張させる」。しかし、コルモゴロフ複雑性という特定のプログラムを気にしない、我々はデータを生成するために使用:それだけを気ほう生成プログラムは最小です。体系的な肥大化は、コルモゴロフの複雑さを追加しません。これは、コード内のそのようなパターン自体を非常に少ないコード量で生成できるためです。たとえばrun(shortGenerator)、取得するために体系的な肥大化の負荷全体を取り、追加する場合run(bloatedGenerator)、フォームの短いジェネレータがまだ存在しrun(addBloat(shortGenerator))ます。
  • 関数をコード自体と同じように肥大化させる必要があるように、非体系的に、つまりパターンなしで肥大化を追加しaddBloatます。ただし、パターンがあまりないため、何かがランダムになります(コルモゴロフの複雑度が高い)。従って、このように生成プログラム肥大ない出力のランダム(コルモゴロフ複雑性)を増加するが、それはまた、我々はソースコードの形で提供する必要がランダム(コルモゴロフ複雑性)の量を増加させます。したがって、プログラムではなく「ランダム性」を提供しているのは依然として私たちです。上記の書き込みの例ではprint([...])、非体系的な膨張を追加することは、そのハードコーディングされたリストに「ランダムな」数字をさらに書き込むことと同じです。

「同じバイトシーケンスを出力する最短の決定論的プログラムを見つける」-これが私の主張のポイントである感嘆符です。この画像を繰り返すことはできません。毎回ユニークです。パターンは、Java、JVM、OS、CPU +キャッシュ、ハードディスク、CPU / RAMサイクルを消費するストリーミング音楽であるTrance音楽、およびその間のすべての相互作用の結果です。パターンは、for / nextループ内のJavaコードの1行から単純に発生します。エントロピーの重要な部分は、基礎となるハードウェア回路に由来します。コーディングできません。
ポールUszak

@PaulUszak Kolmogorovの複雑さは、最初に投稿した画像のように、特定の値の「ランダム性」を測定します。または、投稿した2番目の画像。または、このHTMLページのスナップショット。など。画像を生成するプロセス(決定論的または非決定的)に関心がある場合は、シャノン情報などの他の手段がより適しています。コルモゴロフの複雑性について言及している回答は他にないことがわかりました。彼らは私たちにさまざまなことを教えてくれるので、どちらも便利な方法です。
ウォーボ

@PaulUszakこれらの画像をPNGファイルとして圧縮し、ファイルサイズを比較して行ったテストを検討してください。PNGを解凍すると、最初とまったく同じ画像が返されます。それは決定論的です。別のランダムな画像取得しません。それはあなたの圧縮テストが役に立たないのですか?どういたしまして!コルモゴロフの複雑さは、PNGテストの極端なバージョンのようなものです。PNGファイルに圧縮するのではなく、(決定論的な)コンピュータープログラムに圧縮します。元のデータをすべて再現しながら、それらを非常に小さくすることができます。
ウォーボ

6
@PaulUszakベースは、あなたのコメントに、あなたが既に見積もりを証明するために必要なすべてを実現しているようです:あなたはしませんでした使用決定論あなたがに頼っているので、パターンを作成するための手段をあなたや外の世界(ネットワークハードウェアおよびサーバというエントロピーストリーミングしている、ストリームのコンテンツなど)がシステムに導入されています。ループで取得されたナノ秒単位で最後の8ビットの時間測定値をチェックするかどうかは、そのエントロピーを収集する良い方法です。多くの答えがハングアップしている別の質問ですが、別のトピックです。
mtraceur

7

圧縮はランダム性の正確なテストではなく、画像を見て「ランダムに見える」と言っているわけでもありません。

ランダム性は経験的な方法でテストされます。実際、TestU01Diehard テストなど、ランダム性をテストするために特別に設計されたソフトウェア/アルゴリズムのスイートがあります。

さらに、画像は実際にはスペースにマッピングされた1Dの数字列であるため、表示される特定のパターンの適切な表現ではありません。

ピクセルごとに画像を調べると、突然低下する前に、値が増加する多くの短いパターンを見つける可能性が高くなります。サンプル値であるx値と「ランダム」関数から取得した値であるy値を使用してグラフを作成した場合、データは実際には鋸歯状波のように見えます。

のこぎり波

これは、モジュラー演算の下で増加する値によって作成されるパターンです(これは、計算の例です:ほぼ一定の速度で増加する時間、および& 0xFFとして機能しますmod 256)。


テストのセットが間違っているようです。すべてのテストは、ランダムな合否テストです。彼らはこの質問の核心であるエントロピーを測定しません。圧縮は、非IIDデータに対して完全に有効なエントロピー測定です(NISTエントロピー測定を参照)。実際、プログラミングと数学の博士号がなくても合理的に実装できる数少ないものの1つです。あなたは鋸歯については正しいですが。それはそのようなものですが、歯はあなたが示したように規則的ではなく、非決定的にランダムです。したがって、エントロピー。
ポールUszak

2
@PaulUszak圧縮アルゴリズムに依存する場合、その尺度は意味がありますか?
-kutschkem

@kutschkemは、NIST SP 800-90Bの標準エントロピー測定の1つです。それも簡単です。IID以外のエントロピーを他にどのように測定できますか?また、圧縮アルゴリズムは下限に漸近するため、2で除算されます。シャノンの式はここでは機能しません。
ポールUszak

3
@PaulUszak-暗号化の目的で、攻撃者が生成方法を知っていると想定する必要があります。このデータが生成された方法を知っていると、PNGまたはNISTテストが行​​うアプローチよりも優れた圧縮アルゴリズムを書くことができます。データのソースについて。
ジュール

5

「ランダムに見える数字」から、乱数の概念を混同しています。

フォン・ノイマンの引用を理解するには、「乱数を生成する」という意味を理解する必要があります。 Warbo の答えは、優れたXKCDをこの目的に結び付けています。 XKCDコミック

乱数について語るとき、値自体について語るのではありません。明らかに、4は3よりもランダムではありません。ランダムチャンスよりもこの値を予測するサードパーティの能力について説明しています。乱数は、予測できないものです。時々、これに条件を追加します。暗号的に安全な擬似乱数ジェネレーター(CSPRNG)は、攻撃者がシード/キーを知らない場合、ランダム確率よりも予測できない数字を生成しますが、真の乱数(擬似乱数ではない)について話している場合、通常、キーを含むシステムの完全な知識があっても、予測不可能な数値として定義されます。

さて、あなたの例は、多くの人が指摘しているように、決定論的ではありません。プログラムは、どの値が出力されるかを指定しませんSystem.nanoTime()。したがって、CSPRNGを使用して擬似乱数を生成するクラスとは異なります。前者は非決定的であり、後者はキーの値が決定的である場合に決定的です。前者には、確定的な値を持つように定義されていない操作が含まれています。

しかし、あなたは私がそれが非決定的であるかもしれないと言ったことに気付くでしょう。System.nanoTime()この目的のために値を提供するように設計されていないことに注意してください。十分に非決定的である場合とそうでない場合があります。アプリケーションは、System.nanoTime()すべてへの呼び出しが256ナノ秒の倍数(またはクローズ)で発生するようにシステムクロックを調整する場合があります。または、Javascriptで作業している可能性があります。このスクリプトでは、最近のSpectreの悪用により、主要なブラウザーがタイマーの解像度を意図的に低下させています。これらの場合、計画していない環境で「乱数」が非常に予測可能になる場合があります。

  • したがって、決定論的プロセスで乱数を生成しています... sin。
  • 専用のランダムハードウェアで乱数を生成します...罪ではありません。
  • コンピューターの非決定論的な側面で乱数を生成することは、おそらく罪です。

それはすべてあなたの意図に依存します。スポンジボブへのラブレターを暗号化して、妹が読むことができない場合、いわゆる乱数に課せられる要求はかなり低くなります。 System.nanoTime()あなたがしたように使用することはおそらく十分です。核秘密を積極的に求めている先進外国から核秘密を保護している場合、挑戦に耐えるように設計されたハードウェアの使用を検討することができます。


4

あなたはその主張を理解していないと思います。ポイントは、「乱数」系列(または実際には何か)を生成する決定論的な手順がある場合、パターンを見つけることは、この手順を見つけることのタスクに過ぎないということです。

したがって、次の整数を予測する決定論的な方法が常に存在します。これはまさに、ランダム性を仮定した場合に発生するとは予想されていないことです。

十分に複雑な決定論性は確率論と区別できません。

--Wrzlprmft のユーザーページから

したがって、たとえ何かランダムに見えても、それを生成する決定論的な手順があるのに、一体なぜ「ランダム」としてモデル化するのでしょうか?

これが重要な問題だと思います。次の形式のみを表示しましたPRNGと「真のランダム性」区別できないです。

ただし、これらの概念が等しいということは従いません。特に、ランダム性は数学的な理論上の概念です。理論上、PRNGを「真のランダム性」と見なすと矛盾につながることをすでに示しました。したがって、それらを等しくすることはできません。


1
エラー、あなたはその引用を理解したと確信していますか?あなたはそれを自分で矛盾しているようです。
ポールUszak

私ですか?明確にできますか?何かをランダムに扱う場合、他の誰かがその違いを認識できないとしても、決定論的にそれを生成することは意味がありません。
離散トカゲ

2
@PaulUszakあなたは何かが確率的に見えるので、それはランダムだと主張します。しかし、実際には、何か確率論的に見えるからといって、それがランダムであることを意味するわけではなく、十分に複雑な決定論的プロセスである可能性もあります。
ジル 'SO-悪であるのをやめる'

On2

3

他の人がすでに指摘していると思いますが、それは強調されていなかったので、議論に加えてみましょう。

他の人がすでに指摘したように、エントロピーを測定する問題があります。圧縮アルゴリズムは何かを伝えるかもしれませんが、ソースに依存しません。データがどのように生成されたかについて詳しく知っているので、おそらくそれを圧縮するためのはるかに優れたアルゴリズムを解釈することができ、それは真のエントロピーがはるかに低いことを意味します。

さらに、「コンピューター上」と「決定論的」というフレーズの意味を多少間違えています。もちろん、コンピューターで非決定的な操作を実行できます。

さらに、実際には、あなたはそれをやっただけですが、それは一見したところ明らかではありません。

典型的な決定論乱数生成の的アルゴリズムは次のとおりです。線形合同ジェネレーターのようなPRNG。それらはステートフルです。次の状態は前の状態によって決定されるため、内部状態はエントロピーが少ないことを意味します。私はそれを掘り下げません、それはおそらくあなたに明らかです。重要な点は、完全に決定的なアルゴリズムは、以前の状態のみに依存するということです。

次に、アルゴリズムを見てください。何に基づいていますか?州はどれくらいありますか?それは決定論的ですか?

  file.writeByte((byte) (System.nanoTime() & 0xff));

file.writeバッファをフラッシュし、I / Oを待つ問題を無視してみましょう(ハードドライブケーブルにちょっとしたノイズを加えようとしましたか?いいえ、できますか?ちょっと、それは非決定的です!:))、そしてソースに注目しましょう、それはより重要です。

時間は状態のいくつかの種類です。さまざまですが、ほとんどは同じです。それが、あなたがそれを回避しようとし、&0xFFを使ってほとんどの州をドロップした理由です。ただし、すべてを削除したわけではありません。前の読み取りの状態が次の読み取りに漏れる可能性があるため、完全に非決定的ではありません*)

しかし、それには興味がありません。引用が間違っていることを「証明」するには:

決定論的な手段で乱数を生成しようとする人は、もちろん罪の状態に住んでいます。

決定論的な手段でそれを証明する必要があります。
私たちが興味を持っているのは:あなたのアルゴリズムは確かに完全に決定論的ですか?

..そしてそうではないことは明らかです。

  System.nanoTime() & 0xff

それは時間の測定です。時間測定。値がキャッシュされる場合、測定部はそれを決定論的にするかもしれません。そうでないと思いますが、そうでなければこの関数は意味を持ちません。次に、ソースからオンザフライで読み取る場合、時間ベースの値があります。(私は再び仮定します)あなたはシングルタスク専用ハードウェアでそれを実行していないので、コンテキストスイッチが時々作動するかもしれません。単一タスクの専用ハードウェアを使用している場合でも、時間ソースの温度/湿度のドリフト、バスのクロック時間などのために、時間測定は依然として決定的ではない場合があります。

私はここで誇張していることに完全に同意します。ドリフトは、大きなインパクトを与えるほど大きくはありません(実際nanotimeにはそうなる可能性があります)。さらに重要なnanotimeことは、高速であることを意味します。リアルタイムソースからは読み取りません。これは、プロセッサの内部命令/サイクル数に基づいています。コンテキスト切り替えがないことを確認する場合、これは実際に決定論的です。

私の要点は、時間に基づいた場合、真に100%の決定論的アルゴリズムを実行するのは実際には非常に難しく、完全に決定論的な手段がない限り、その引用に反論する権利はないということです。

*)おもしろいことに、筋金入りの方法で行けば、実際のランダム性を高めることができます。各ビットを読み取る前に、ビットごとに&0x01を実行し、顕著な時間をスレッド待機します。そのようにデータを生成するのはばかげて長いですが、実際にはほぼランダムであるとみなすことができると主張しますOSがスリープ状態になるか、別のタスクにコンテキストスイッチされました。


2
また、「ランダムな」データが決定論的に生成された場合、「シードSを与えられたアルゴリズムAの出力の最初のバイト」と言うだけで、任意の大量のデータを圧縮できることも指摘する価値があると思います。もちろん、汎用コンプレッサーはそのパターンを発見しませんが、それはそこにないという意味ではありません。NAS
デビッドリチャービー

そのようなことは、まさに「[あなた]がはるかに優れた[圧縮]アルゴリズムを構築できる」ことの背後にある私のポイントでした
ケツァルコアトル

正確な5.3値に固執しないでください。圧縮アルゴリズムをどれだけ改善できるかに関係なく(私が世界で最高のものの1つであるpaq8pxを使用することはできません)、非圧縮性のままであるのは純粋なエントロピーです。これは、ランダム性の主要な定義の1つです。または、何かをゼロバイトに圧縮できることを提案していますか?ハトの愛好家は同意しません。
ポールUszak

64ビット整数を使用して適切なpiccyを作成できないため、0xffがあります。また、0x01を使用する場合は、気にすることのできないビット処理をいじる必要があります。それで全部です。NISTエントロピーと私自身の測定値は、とにかく上位ビットのエントロピーを示唆しています(そのうち5つまで)。
ポールUszak

1
+1、これはこれまでのところ最良の答えのようです:質問されている状況でのエントロピーの唯一の原因は、正確にクロックの各読み取りの間に経過する時間の不一致です!そして、それはどのようにオペレーティングシステムのスケジューラの動作とどのようなハードウェアの作品や詳細などの詳細のミックスから来て、ユーザーがその瞬間にそのシステムまで何をしたか他に何を必要とスケジューリングまたはどのくらいのディスクのような順番で間接的な効果のもの時間の経過に伴う断片化、スワップ/メモリ/キャッシュの内容、または進行中のネットワーク/その他のアクティビティによりアクセスが発生しました。
mtraceur

2

あなたが必要とする答えは、あなた自身が別の答えに返信したこのコメントから始まると思います:

パターンは、Java、JVM、OS、CPU +キャッシュ、ハードディスク、CPU / RAMサイクルを消費するストリーミング音楽であるTrance音楽、およびその間のすべての相互作用の結果です。パターンは、for / nextループ内の1行のJavaコードから単純に発生します。エントロピーの重要な部分は、基礎となるハードウェア回路に由来します。

あなたはすでにこれを認識しています、私は思う:あなたは使用しなかった パターンを作成する決定論的手段を。

無視できない部分が決定論的であるコンピューターを使用しましたが、エントロピーは外部の非決定論的(または、少なくとも現時点ではすべての実際の意図と目的に対して非決定論的)のソースから生じました:あなたまたは外部の世界が相互作用していますコンピューターを使用します(程度は低いですが、物事のタイミングに影響を与える可能性のあるコンピューターハードウェアの物理的な欠陥)。

ちなみに、これは現代のオペレーティングシステムがプログラムで利用可能な乱数ジェネレーターをシードする方法の大きな部分です。ハードウェアとユーザーとの相互作用のエントロピーを利用することにより、攻撃者には予測できません。

ちなみに、外部世界のエントロピーは実際には、それ以外の点では適切にコーディングされた暗号化で今日まで対処しなければならない問題です。予測可能な動作をするコンピューター起動時および実行時(読み取り専用ストレージを備えたネットワーク、ネットワークから起動するネットワーク、予測可能なネットワーク環境(ネットワークに接続されていないか、ネットワーク上のワークロードが十分に低いためすべてが配信される)信頼性のある時間)、およびほぼ一貫した動作で同じ限られたソフトウェアセットを実行する場合、これらの予測不可能なコンポーネントから得られるエントロピーを大幅に過大評価し、はるかに予測可能な数を生成する可能性がありますバックグラウンドで他のあらゆる種類の作業(音楽のストリーミング、Dropboxとの同期など)を行う典型的なワークステーションに乗るよりも。

ほとんどの答えは、ループで取得されたナノ秒単位の最後の8ビットの時間測定値を確認することが、そのエントロピーを取得するのに良い方法であるかどうかに焦点を当てていると思います。これは、非常に適切に答えるために重要な質問の前に、あなたは、乱数生成方式として、あなたの例ではメソッドを使用し、実際にしかし、それは私はあなたがについて尋ねていると思うものとは別の質問です。


0

以前の回答に追加するために、この質問について考える簡単な方法があります。

それはすべてランダム決定論の違いについてですです。その後、フォン・ノイマンと彼が言っていたことに来ます。

乱数

真の乱数ジェネレーターにはパターンがなく、バックグラウンドで隠されていません。これを使用して、これまでのシーケンスで次の数値を予測できました。理想的な世界では、物理宇宙で、そしてシステムについて、ナノ秒ごとに知る必要のあるすべてのものを知ることができますが、生成される次の数を試して予測することはまだ役に立ちません。

それは理想的なケースです-実際には、ランダムに「悪くない近似」であるか、本当にランダムであるか、数学的に物事を十分に混ぜ合わせて多くのソースを一緒に混合することでそこに到達します特定の数字やパターンに対する偏りがない。

  • 「良い」ソースは、放射性崩壊プロセス、または本質的に予測不可能な他の量子プロセスを待つことに似ています。熱に敏感な半導体からの出力。ダイオードまたはその他の電気材料のランダムノイズ。太陽からの光子を数える。

  • これに混ぜて、「悪くない」と考えるものを追加することもできます。これらは、これらに接続していないので役立ちます。次のマウスクリックまたはネットワークパケットを待ちます。次のファイル書き込み時のマイクロタイムの最後のビット。「既知であるが数学的にかなりランダムな」疑似乱数ジェネレーター関数の出力。乱数の以前の使用からの以前のエントロピー。

ここでの目的は、あなたが知っている宇宙何であれ、まだ予測できない数を取得することであり、数学的に検出可能なパターン、バイアスまたは予測可能性、およびイベントとの相関なしで、統計的にそれと同じくらい可能性が高い監視し、予測に使用できます。(または、イベントに関連付けられている場合は、「最後のマウスクリックの時間のみのナノ秒桁」など、接続が非常に希薄になるように行われます)

確定的な数

数学者は、式と関数に関することを証明できます。したがって、関数が繰り返し呼び出された場合、単純なパターン「これらは繰り返し呼び出された場合のその関数の出力」以外のパターンにバイアスや優先度を与えないことを証明することができます。

たとえば、100万から1,000万の間の数字を選択し、それをバイナリで記述し、繰り返し「ハッシュ」すると、かなりランダムな数字のシーケンスが得られます。それはほとんどランダムです-しかし、実際にはまったくランダムではありません。与えられたアルゴリズムと状態、次の数字はどうなるかを予測できます。

見た目が似ていて、そうでなくても主にランダムであると思われるため、「疑似ランダム」と呼びます。

これが良い例です。この3桁の「乱数」のシーケンスについて考えてみましょう:983、367、336、244、065、664、308、602、139、494、639、522、473、719、070、217。同じようにして100万個の数字を生成できます。統計学者に渡すことができます。統計学者は、それらが平等に分配されるかどうかを確認します。明らかな予測可能なパターンはありませんb。彼らはかなりランダムに見えますよね?しかし、今私は彼らが実際に

3番目にグループ化されたPiの500番目以上の桁。

突然、しかしランダム

Piの桁

次の2つの数字が986と094になるとすぐに予測できます。

明確にするために、私は正確にどのくらいランダムに

Piの桁

あります。それは研究されており、その答えはよく知られています。しかし、ポイントはこれです:原則として、同じ結論がために真である任意の決定論的プロセス以下生成されたソース

間に

2つの間にあるのは、「ランダムに見え、しばしばある程度ランダムであるもの」の全範囲です。ランダム性とランダム性が混在するほど、出力は数学的にパターンを検出したり、出力を予測したりする傾向が少なくなります。

フォン・ノイマンとあなたの質問に戻る

ご覧のとおり、決定論的な出力はランダムに見えるかもしれませんが、統計的にはランダムに分布しているかもしれません。彼らは、私たちが知ることの現実的な希望を持たない「秘密」または急速に変化するデータを使用するかもしれません。しかし、それが決定論的である限り、数字はまだ真にランダムになることはありません。それらは「ランダムに十分に近いので、違いを忘れてうれしい」だけです。

それはあなたが与えた引用の意味です。決定論的なプロセスでは、乱数を与えることはできません。乱数のように見え、非常に似た振る舞いをする数値のみを与えることができます。

「私の(または最新の)コンピューターの出力は完全にランダムに表示され、動作する可能性があります。これは、フォンノイマンの引用が古くなって正しくないことを意味しますか?」

問題はこれです:コンピューターの出力がランダムに表示され動作する場合でも、それはまだ真にランダムではない可能性があります。それが決定論的にのみ計算される場合、それは次の数のgettinbgについて予測不可能な原因効果ではないことを意味します(この意味で「決定論」が意味するものです)。既存のデータ(既知)から始め、既知のプロセス(複雑または乱雑なものなど)を適用し、新しい「乱数」と思われるものを取得します。しかし、プロセスは決定論的であるため、ランダムではありません。

メソッドにそれを修正するための真のハードウェアランダムジェネレーター(半導体の放射性崩壊やノイズから生成される乱数など)が含まれると言う場合、答えはランダムになる可能性がありますが、定義によるメソッドはもはや決定論的ではありませんこれは、入力/初期データ(原因)が与えられた場合、出力(または効果)を予測できないためです

フォン・ノイマンは、ほぼ定義により、両方の方法で勝ちます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.