アプリ開発日誌
2021.07.15
コンピューターのランダムは本当にランダムだったの?
人類は、何千年もの間、乱数をなにげなく使用してきたので、その概念は決して新しいものではないです。
古くは、古代バビロンの宝くじ、現代ではモンテカルロのルーレットテーブル、ラスベガスのサイコロゲームまで、
目標は最終結果を偶然に任せることです。
ランダムを生成するとき、真っ先に何を想像しますか?
僕なら当然、サイコロが頭に浮かんできます。
転がりにくいけど4面とか、もっともメジャーな6面、ゲームしか使わないけど20面とか・・・。
まぁ色んなタイプがありますよね。
サイコロ振って、結果、本人でも予測できない数字が出来ますよね。(基本的には…)
また、多くの人はコインを想像したかも。
コイントスして表か裏は予想できないですよね。
色んなスポーツで世界レベルの試合において使ってるコイントス・・・
ギャンブルはさておき、ランダム性は科学、統計、暗号化などで多くの用途があります。
サイコロ、コイン、または同様のメディアをランダムなデバイスとして使用することには限界があります。
なので、結局は複雑なランダム性を生み出すのに、コンピュータを使う事になります。 ?
では、プログラミングする時にコンピューターはどんな方法でランダムを発生させるのか?!
真の乱数
この方法は物理的プロセスに基づいており、ランダムであると予想される何らかの物理現象からランダム性の原因を収集します。
このような現象は、コンピューターの外部で発生します。
これは、測定プロセスによって発生する可能性のあるバイアスについて測定および調整されます。
例として、放射性崩壊、光電効果、宇宙背景放射、大気ノイズなどがあります。
そのようなランダム性に基づいて生成された乱数は、「真の乱数」であると言われます。
疑似乱数
「真の乱数」の代わりに、乱数を生成する2番目の方法には、明らかにランダムな結果を生成できる計算アルゴリズムを使います。
なぜ、ランダムにできるのか?
得られる最終結果は、実際には、シード値とかはキーとも呼ばれる初期値によって完全に決定されるためです。
したがって、キー値とアルゴリズムがどのように機能するかを知っていれば、
これら一見ランダムに見える結果を再現する事が可能になります。
だから「真の乱数」ではないですね。
コーディングの話にすると言語によってSyntaxが変わっていますが、
「Math.random()」とか「rand()」とか「numpy.random」は「疑似乱数」です。
真の乱数を発生してみたい方は ramdom.org のサイトを参考して読んでみてください。
ランダム性は大気ノイズに由来します。「真の乱数」になります。