乱数とは
乱数と言われて、イメージするのはどのような数列でしょうか。
乱数というのならば、まず「でたらめ」であることは第1条件です。例えば
47891346789234897234
という数字(私がキーボードで適当に入力した数列)は乱数の一つになり得るかもしれません。では、
913923772323913923772323913923772323
という数列はどうでしょうか?
一見無秩序に数が並んでおり、でたらめにも見えます。ですが実は、この数列は
913923772323
という数列を3つ連結させただけのものです。ある乱数に見える数列が、実はある数列の繰り返しであるとすれば(一定の例外を除いて)それは乱数とは言えないでしょう。ここに、乱数のもう一つの重要な性質「予測不可能」を見出すことができます。
「乱数」を作ることは難しい
ここまで「でたらめ」で「予測不可能」な数列を乱数であると考えてきました。
しかし、このような数字を人工的に作り出すことは、果たして可能なのでしょうか?
先程私がキーボードで入力した適当な数字、あれは確かに「予測不可能」で「でたらめ」に見えます(ある数列が本当に乱数か?という話はさらに難しいのでここでは置いておきましょう)。しかし実世界で使われる乱数は何兆桁まで行くのが普通です。そんな乱数を手動で作るのは無理です。
であれば、当然コンピュータを使うことになります。しかし、コンピュータとは、人間が定めたルールに従った計算しか実行できません。つまり、「でたらめ」になることはない、ということです。何故なら、人間がルールを定めた地点で、そのルールに秩序付けられた数列した生まれないからです。さらに言えば、そのルールさえ特定すれば、次の数字が確実に予測できます。「予測不可能性」も成り立ちません。
実際の乱数
では乱数をコンピュータで作ることは不可能なのでしょうか?
実はそうではありません。
コンピュータは定められたルールに則ってのみ計算ができますが、その計算のルールの中に「ランダム性」を取り入れることで、乱数を作ることができます。
例えば、pythonで
a = 12
for i in range(n):
print(((i*i+i*9+90*i*i)%12i)%a)
というコードを実行します。すると、
04864801080
という出力を得ます。この結果は宇宙のどこでも同じです。
しかし、例えばaを1増やすと、
04753710560
という異なる結果を得ることができます。従って、aにランダムな数字を入れさえすれば、同じルールでも異なる乱数をいくらでも作ることができます。
では、このランダムな数字はどこから持ってくれば良いでしょうか?
答えは物理現象です。
例えばサイコロを1回振るとしましょう。すると1~6の何かしらの数字が出てきます。
もう一度振りましょう。すると1~6の何かしらの数字がまた出てきます。
この2回の試行は「独立」です。即ち、1回目で1が出たから2回めに6が出やすくなる、といった関係は存在しません。従って、次の出力を予測することは不可能です。さらに、サイコロに作為がなければ、必ず1~6の数字が当確率で出ます。従って、数列はかならず「でたらめ」になります。
実は身の回りの殆ど全てのことに同じことが当てはまります。
例えば、くしゃみをしたときの粒子の数、指を1mm動かしたときにぶつかる酸素分子の数、エンターキーを押すタイミング、原子の震え「ブラウン運動」など、全て予測不可能でランダムな振る舞いをします。このような物理現象から得た乱数を「物理乱数」と呼び、乱数に必要な性質を兼ね備えていることが証明されています。
このような外部から取り入れた「ランダム性」は「エントロピー」とも呼ばれます。「エントロピー」は物理学の用語で、「乱雑さ」を表す指数です。
このように乱数を作り出す外乱要因を、決まりきった計算しかできないコンピュータの中に取り入れることで「乱数」を作り出すことができるのです。
現実には、コンピュータは内部に電子回路の雑音や、電線のノイズを観測し、ここからエントロピーを補給しています。そのおかげで私達は乱数の恩恵にあやかることができるというわけです。
まとめ
・乱数とは、「でたらめ」で「一様」な数列のこと
・コンピュータはそれ単体では真の「乱数」を作り出すことはできない
・コンピュータは外部からエントロピーを補給することで物理乱数を大量に作り出している