ソフトウェア関係の雑誌を読んでいたら、次のようなことが書かれていました。
「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)
」が簡単です。
Pressほか『ニューメリカルレシピ・イン・シー』(技術評論社, 1993)にこんな記述がありました。
悪い
rand()
のため結果が疑わしいすべての科学論文を図書館の棚から消せば、各棚にこぶしが入るほどの隙間ができるであろう。(p.203)
「悪いrand()
」ではなく「悪い乱数」を対象にすると、隙間はどのくらいになるのでしょう。