擬似乱数とは?わかりやすく仕組みを解説!【メルセンヌツイスタ】

セキュリティ

「乱数」とは、つまり「1534534573」とか「9687543234」とか「6827572858」というような、ランダムな数のことです。
「サイコロを振るプログラム」や「おみくじを引くプログラム」など、プログラム開発のありとあらゆるところで使われます。

それを踏まえて「擬似乱数」とは、「一見すると乱数のようにみえるけれど実は乱数じゃない乱数」のことです。
これだけ聞くと「なんじゃそりゃ!?」という感じかとは思いますが

ITの世界において、全ての乱数は「擬似乱数」で出来ています。

乱数にみえる数の羅列は、実は全て計算によって導き出された数なのです。
コンピュータは本当の意味でランダムな数を生成することはできないので、擬似乱数という形であたかも乱数のような数値を作り出すのです。

擬似乱数はどうやって作られるの?

擬似乱数の作り方は様々ですが、一番性能が良いと言われている「メルセンヌツイスタ」というアルゴリズムをご紹介しましょう。

といっても、実際のアルゴリズムの内容を説明しようとすると
頭が痛くなるほどの複雑な計算式を説明しなくてはいけなくなるため、そこは割愛させていただきます。
(雰囲気だけでもご覧になりたい方は、こちらの公式サイト論文をどうぞ。)

擬似乱数のアルゴリズムは、計算式は違えど考え方はどれも同じです。

元となる数(シード値)を、複雑な計算の末に導き出した数が、擬似乱数。

つまりこういうことです。↓

シード値「1234」→複雑な計算例「1234x4321+1234-4321」= 擬似乱数「5329027」
シード値「5555」→複雑な計算例「5555x5555+5555-5555」=擬似乱数「30858025」
シード値「4649」→複雑な計算例「4649x4649+4649-4649」=擬似乱数「21613201」

「複雑な計算例」の部分は、僕が今適当に考えた計算式です。それでも一応乱数っぽい値が生成されていますね。
ここの計算式は、擬似乱数アルゴリズムによって異なります。
「シード値」の部分は、生成のたびに異なる数値となるようなものを指定します。
たとえば「現在の時刻」などです。シード値の生成も、擬似乱数アルゴリズムによって異なります。

できるかぎり「結果に偏りがなく」かつ「処理速度が速い」計算式が、優秀な擬似乱数アルゴリズムだといわれています。
その1つが、冒頭で例にあげた「メルセンヌツイスタ」というわけです。


Category
9WEB