一様乱数から正規乱数を作る方法?

ソフトウェア関係の雑誌を読んでいたら、次のようなことが書かれていました。

「0以上1未満の一様乱数を12回足して6を引くと正規乱数になる」というテクニックを覚えておけば、一様乱数しか提供されていない開発環境で大いに役立つはずだ

これは中心極限定理のいい例ですね。実際に乱数を大量(下の絵では100万個)に発生させてそのヒストグラムを描いてみると、正規分布になっているように見えます(太線は正規分布)。これで十分な場合も多いでしょう。

しかし、正規性の検定をすると、正規分布であるという仮説を棄却したくなるようなp値が得られます。Mathematicaで試します(参考:DistributionFitTest)。

In[1]:= randomGaussian[] := Sum[RandomReal[], {12}] - 6

In[2]:= data = Table[randomGaussian[], {1000000}];

In[3]:= DistributionFitTest[data, NormalDistribution[0, 1]]

                  -8
Out[3]= 8.33717 10

この方法で生成される乱数の分布は、足す数(上の例では12)を増やせば正規分布に収束しますが、正規分布ではありません。ですから、「正規乱数になる」という表現はいけません。(例えば「randomGaussian[] := (Sum[RandomReal[], {24}] - 12)/Sqrt[2]」ならもっと正規分布に近づきますが、依然として正規分布ではありません。)

一様乱数しか提供されていない環境では、ボックス=ミュラー法などを使うのがいいと思います。Excelでは「=NORM.INV(RAND(),0,1)」が簡単です。

4874085601Pressほか『ニューメリカルレシピ・イン・シー』(技術評論社, 1993)にこんな記述がありました。

悪いrand()のため結果が疑わしいすべての科学論文を図書館の棚から消せば、各棚にこぶしが入るほどの隙間ができるであろう。(p.203)

「悪いrand()」ではなく「悪い乱数」を対象にすると、隙間はどのくらいになるのでしょう。