擬似乱数:危険な発生法とMersenne Twister法(講演記録)

松本眞先生の講演は分かりやすいすばらしいものでしたが、矢野の実力が追いつきませんので、大雑把な記録になりました。それと忙しいので、質問は受け付けません(質問に答えられるほど能力ないし)。雰囲気だけ楽しんでください。

[乱数]
乱数に関する定義はいくつかあるが、万人が納得する乱数の定義は(実は)ない。しかし、実用上はさほど問題ではない。講演では「一様かつ独立に次々とでたらめな数を発生させる方法」を(一様)乱数発生法という。

たとえば、実数乱数を発生させたいときにはでたらめに{0,1, .... 2^32-1}を発生させて2^32で割って[0,1]の一様乱数を発生させる。

今回はモンテカルロ法で使用する乱数に関してのみ述べる。

[計算機で乱数は作れない]
計算機で乱数は作れない→計算機は決定的な動作しないから

[物理乱数]
乱数としては理想的だが、コストやスピードに問題あり
また、追試のために再現性が必要な場合にも難あり(どこかに保存しておかねばならないが)

→そこで擬似乱数発生法:漸化式を使って乱数のように見える数列を生成する方法。擬似乱数のメリットは「高速で低コスト」。でも、「これって『乱数』って呼んで良いのか?」疑問。乱数の定義はいろいろあるが、メルセンヌ・ツイスターでは周期と高次元均等分布性に着目して考案。

会場から「安価で高速な物理乱数発生ボードを開発した」との発言あり(次回のセミナーで発表か?)。

[線形合同法]
おそらく今でも世の中で最も使われいる方法
x_{t+1} = 11035155245 x_t + 12345 mod 2^32
周期は2^32。しかし、現代のパソコンは数分で2^32個の乱数を使ってしまう。

[ラグつきフィボナッチ]
UNIXC言語で現在推奨擬似乱数
最下位ビットに深刻な偏りあり
KnuthがTACP[1997]で推奨したものも同形

[3項GFSR系列(M系列などとも呼ばれる)]
1968年から0-1の偏差が報告されている
なぜか今でもこの問題が「新発見」のように発表されることがある

[Twisted GFSRとMersenne Twister]
Twisted GFSR(松本・栗田[1992, 1994])
Mersenne Twister(松本・西村[1998])

TGFSRの周期を大きな素数の形にするため漸化式を改良したものがMT

高次元均等分布性に関してMTは32ビット整数列として623次元均等分布(MT以前は20次元均等分布程度だった)

[まとめ]
1. 今でも欠陥のある古い擬似乱数が標準乱数としてライブラリに組み込まれているので注意が必要
2. それどころか新しく提唱・採用された擬似乱数にもしばしば欠陥がある
3. 現在でもなおMTは周期性・均等分布性・高速生成の3点から見て最も優れた擬似乱数発生法の一つと言える

[参考]
間違いだらけの疑似乱数選び(松本眞、[2002])
http://www.soi.wide.ad.jp/class/20010000/slides/03/1.html