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


47

私は、100万個の乱数を生成する必要がある趣味の問題を解決しようとしていました。しかし、私はすぐに気付きました、それらをユニークにするのは難しくなっています。乱数生成について読むために、アルゴリズム設計マニュアルを取り上げました。

次の段落があり、私には完全に理解できません。

残念ながら、乱数の生成は実際よりもずっと簡単に見えます。実際、決定論的なデバイスで真に乱数を生成することは基本的に不可能です。フォン・ノイマン[Neu63]は、「ランダムな数字を生成する算術的方法を検討する人は、もちろん罪の状態にあります。」と言っています。ランダムに生成された場合。

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


86
あなたは本当にあなたが本当に作り出すことができない理由を尋ねるランダムに数を決定論的デバイス?質問にはすでに答えが含まれていませんか?
ハービー

37
生成するすべての数値が一意でなければならない場合、それらは実際にはランダムではありません。真の乱数ジェネレーターが同じ結果を連続して10回与えることは完全に可能です。
TMN

28
探しに問題が存在し、ランダムなある数字ユニークで。数値が一意であるように制約している場合、ランダムではありません。ランダムは、どんなにありそうにもない繰り返しの可能性を要求します。
マークブース

13
コンピューターの外で、ランダムな数字は本当にランダムですか?サイコロを投げる、それは多くのベクトルを持つ物理学です。
MPelletier

9
@MPelletier:まったく違います。量子力学は(科学者がそれをさらに理解したなら)ランダム性の定義に応じて、真のランダム性の存在を暗示するかもしれません。
ブライアン

回答:


65

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

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

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

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

決定論的なデバイスは、同じ開始条件と入力が与えられたときに常に同じ出力を生成しますdeterministic。「真に乱数」とは哲学的な観点のことrandomです。それは、哲学的なへそを注視することの核心であるためです(原子の減衰がランダムであるか、私たちが理解できないパターンに従うかどうかさえ、人々は確信していません)まだ)。暗号的に安全な乱数ジェネレーターは、エントロピーの外部ソースを利用して、デバイスを非決定的にします。


1
そのため、真に乱数を取得することは不可能です。乱数が保証されていないシーケンスが繰り返されない場合でも、同じ入力でプログラムを再度実行すると同じ結果生成されます。そのため、他の誰かが後であなたの乱数を再現することができます。つまり、それはまったくランダムではなかったことを意味します。
スペンサーラスブン

2
@ user973810情報理論からのその定義の問題は、ランダムシーケンスの実際のインスタンスを表示できないことです。合理的な定義言語であれば、ほぼすべての無限シーケンス(技術的な意味で)がランダムであることを証明できます。これは、言語ではまったく記述できないためです。より便利なのは、ランダムシーケンスジェネレーターの概念です。ランダムシーケンスを生成するものではなく、ランダムシーケンスを生成するものです。
ジル「SO-悪であるのをやめる」

13
ちょっとした注意:一部の人々、つまり核物理学者と素粒子物理学者は、原子崩壊のような過程本当にランダムであることをかなり確信しています。
デビッドZ

9
@David:それよりも少し先に進むことができます。ベルの不等式に関するさまざまな実験は、特定の量子プロセスが確実に予測不可能であることを示しています。それらは哲学的な意味でランダムであるか、非局所的な隠れ変数に依存するかもしれませんが、どちらの場合も信頼できる予測はできません。
dmckee

7
@dmckee:ええ、私は、prog.SEのコメントで、ベルの不等式と波動関数の崩壊との関係を説明しようとするのを避けた方が簡単だと考えました。好奇心が強い人はいつでも私たちのサイトに来ることができます;-) Tangurena:確かに、アインシュタインはそう言っていましたが、それはまさに宇宙を決定論的にしたかったということです。しかし、そうではありません。アインシュタインの死の後に行われた実験は、それをかなり決定的に示しました(非ローカルの隠された変数、別名奇妙さを除いて)。彼がアインシュタインだからといって、彼がすべてについて正しいというわけではありません。
デビッドZ

22

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

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

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

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


また、出力値が制限されている(ビット数が制限されている)ジェネレーターでは、非反復は不可能であることに注意してください。しかし、もちろん、決定論的ジェネレータのサイクル長は、すべての可能な順列である理論上の最大値よりもおそらく最も短いでしょう。
9000

@ 9000:もちろんこれは真実ではありません。「ランダム」シーケンスとして、数字(任意の基数)を使用する無理数を取ります。ブーム!繰り返しのないシーケンス(定義による)で、まだ(ベースに)バインドされています。
ThePopMachine

@ThePopMachine:任意の長さのビットの非反復シーケンスを生成できます。これは、無制限の長さの数値の非反復シーケンスに相当します。大きさが制限されている整数の繰り返しのないシーケンス(32ビットなど)は生成できません。32ビット値のすべての順列を生成したら、シーケンスを繰り返す必要があります。あなたが正しいです; 私たちはたださまざまなことについて話しているだけです。
9000

@ 9000:いたちがいません。あなたは、偽の包括的な声明を出しました。実際にn個の異なる値に対して長さkのn ^ k個以下の異なるシーケンスがあり、それを繰り返す必要がある場合、これは非常に明白であり面白くありません。
ThePopMachine

2
@ThePopMachine:少し調子を整えていただければ幸いです。引用するには、«出力値が制限されている(ビット数が制限されている)ジェネレーターでは、非繰り返しも不可能です»。あなたが明示的に語るのは、無理数の[バイナリ]数字のシーケンスとしての、無制限のビット数です。あなたの声明は真実ですが、問題とは無関係です。
9000

10

ローレンス・リーミス著 『離散事象シミュレーション:第一コース』の第2章では、乱数ジェネレーター(より正確には、疑似乱数ジェネレーター)について素晴らしい紹介をしています。

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

歴史的に、計算アプリケーションには3種類の乱数ジェネレーターが提唱されてきました。(b)サーマル「ホワイトノイズ」デバイスなどのハードウェアジェネレータ。(c)アルゴリズム(ソフトウェア)ジェネレーター。これらの3つのタイプのうち、アルゴリズムジェネレータのみが広く受け入れられています。これは、アルゴリズムジェネレーターのみが、次の一般的に受け入れられている乱数生成基準をすべて満たす可能性があるためです。ジェネレーターは次のようにする必要があります。

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

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

その本のコピー(または同様のもの)を手に入れることをお勧めします。PRNGの動作を正確に理解することは、間違いなくあなたの努力に役立ちます。


7

乱数を生成するコードを記述する必要があり、コードはランダムではないためです。(決定論的です)

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

したがって、まったく同じシード値を使用してコードを再度実行すると、正確な同じ数値セットが得られます!合理的な人はどのようにしてそのランダムを呼び出すことができますか?しかし、それは確かにありませんLOOKはランダム。


それらを一意にすることに関して、番号を生成した後、既にその番号があるかどうかを確認し、もしあれば、それを捨てて新しい番号を生成します。


13
プラス面として、反復可能な擬似乱数はデバッグに最適です。
デビッドソーンリー

5

乱数を生成しているので、生成された値は一意ではないはずです。これはランダム性の特性です-真にランダムな(または擬似ランダムな)数値のシーケンスが一意であると言うことはできません。新しい番号が選択されるたびに、選択されていないすべての番号。


1
これは実際には質問答えないため、答えではなくコメントです。
マークブース

5

擬似ランダムの非常に簡単な定義があります:

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

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

無限の未知の変数。

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

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


1
「時間」は、予測できない何かの悪い例です。一方、マウスの動き、マイク入力などは、予測不可能な入力です。
HoLyVieR

3

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

*優れた物理オタクは、宇宙がどのように動作するかを考えると、これらはいずれも超技術的に真にランダムではないことを指摘しますが、この議論のために十分な結果を予測する合理的な方法はありません。


5
パートタイムの物理オタクとして、量子イベントに基づいたジェネレーターは(私たちが知る限り)本当にランダムです。ランダム性が嫌いな人は、量子力学が始まって以来、ランダム性を量子力学から取り除こうとしており、それが行われたのは、それが本当にランダムであるという証拠を積み上げることだけです。
デヴィッドソーンリー

@DavidThornley、...誰かが式を解明するまで。
CaffGeek

1
@Chad:通常の意味での公式はありません。EPR実験では除外されました。それはすべて決定論的であることは確かに考えられますが、簡単に理解できる方法ではありません。
デヴィッド

@DavidThornley、それは間違った言葉だと知っていました。私が言いたかったことはわかっていると思います。誰かが何かが不可能だと言うときはいつでも、他の誰かが最終的に間違っていることを証明します。それは人間の本性です。
CaffGeek

2
それは、誰かが不可能だと言ったために、最終的に誰かが停止問題を解決できるマシンを作ると言っているようなものです。それは方程式を見つけることの問題ではなく、実際に実行されたすべての実験とそれをバックアップする数学に従ってランダムです。
アレックス

2

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


2

決定論は本質的に機能です。代数から、関数はドメインと範囲の間の対応であり、ドメインの各メンバーが範囲の厳密に1つのメンバーに対応することを思い出してください。

したがって、f(x)= zの場合、yがzでない限りf(x)!= yです。それは機能です。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は非決定的な方法で動作する場合があります。たとえば、方程式にマルチスレッドを導入する場合。人間の入力も非決定性を引き起こします。

さて、これは物事が面白くなる場所です。

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

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

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

引用の作成者はさらに一歩踏み出します。

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

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

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

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

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