(これは、異なる目的のために使用する乱数の多くの異なる形態があることに注意してください。いくつかの面ので、いくつかのアルゴリズムがありますが、私はあなたが実際に興味がある方法であなたの質問を理解します暗号化に使用されるランダム性)。
ここでの基本的な問題は、コンピュータが(主に)確定的なマシンであることです。同じ状態で同じ入力が与えられると、常に同じ結果が得られます。しかし、実際にエントロピーを収集する方法はいくつかあります。
- ユーザー入力。ユーザーはシステムに外部からの情報を入力するので、それを利用して情報を得ることができます。放射性崩壊や線路騒音を使用する方法と同様です。
- ネットワーク活動。もう一度、外部の情報源。
- 一般的に割り込み(最初の2つを少し含む)。
- 最初の項目で説明したように、オーディオ入力やWebカメラなどの周辺機器からのノイズを使用することができます。
- 1秒あたり数百MiBのランダム性を生成できる専用ハードウェアがあります。通常は、内部エントロピーの代わりに乱数を直接与えます。あなたはそれからビットを導き出す方法を正確に
はあなた次第ですが、イベントなどのイベント、または実際のコンテンツ間の時間を使用することができます - 一般的にエントロピー源からの偏りをなくす簡単か、些細なとたくさんではありません思考とアルゴリズムの仕事はそれに入ります(上記の特殊なハードウェアの場合、これはすべてハードウェアで行われ、それを使用するコードはそれを気にする必要はありません)。
実際にランダムなビットのプールを取得したら、乱数として使用できます(Linuxの場合は/dev/random
)。しかし、これには欠点があります。通常、実際のエントロピーはほとんどなく、おそらく乱数の要求が高いためです。だから、数字の後ろに何かを予測することはまだ不可能であるか、少なくとも非常に困難な方法で初期ランダム性を「伸ばし」ていくアルゴリズムを発明することができます(Linuxでは/dev/urandom
、FreeBSDでは/dev/random
と/dev/urandom
)。 FortunaおよびYarrowは、いわゆるという暗号安全擬似乱数発生器であり、そのことを念頭に置いて設計されています。生成する乱数の質についてはまだまだ良い保証がありますが、エントロピープールがなくなるまでにはさらに多くのことがあります。
いずれにしても、CPU自体にランダムな0または1を与えることはできません。これにはさらに複雑なものがあります。通常、これには完全なコンピュータシステムや特殊なハードウェアが組み込まれています。プレーンバニラ擬似乱数発生器(のPRNG):
計算乱数の第二のクラスもあります。私が決定論について以前に述べたことは、これがその実施形態です。 シードと同じものが与えられていると、PRNGは毎回正確な同じシーケンス番号を生成します。これは馬鹿に聞こえるが、実用的な利点がある。
多量の乱数を含むシミュレーションを実行すると、ある確率や予測できない振る舞いを伴う分子や原子間の相互作用をシミュレートすることができます。科学では、同じ設定と手順(または計算では、同じアルゴリズムを使用して)を与えられた結果を誰もが独立して検証できるようにします。実際の乱数を使用した場合、唯一のオプションは、他の人が独立して結果を複製できるようにするために使用するすべての乱数を保存することです。
しかし、PRNGを保存する必要があるのは、シードであり、どのアルゴリズムを使用したかを覚えておく必要があります。他の人は、まったく同じ擬似乱数列を得ることができます。 :-)
脚注
を持っていることは非常に素晴らしい特性はさらに、上記のCSPRNGsが含まれていますが、それらは、エントロピーとの定期的な再播種を含み、特別な方法で使用するように設計されているこのを¹しましたその問題を克服する。
あなたの答えに感謝します。だから、実際にCPU自体が自然にランダムな0または1を実際に生成しないか、実際に生成できないということです。代わりに、CPUはランダムに0または1を生成するのに役立ついくつかの外部要因を必要としますか? –
確かに。私はちょうど今私の編集とその文を追加したと思う。 – Joey
非常にクリア、ありがとう –