一様乱数の分散

これは2008/5/11の記事です。

------------------------------------------------------------------------------------------------

ちょっと気になったのでメモ程度に・・・

正規分布を返すメソッド

 仕事や趣味を通じてプログラムを書くことが多いのですが、正規分布を返すものが欲しくなりちょっと調べたら、 java には java.util.Random.nextGaussian() なるお便利なメソッドがあることがわかりました。このメソッドは平均 0.0、標準偏差 1.0 のガウス (「正規」) 分布の double 型の擬似乱数を返します。javaのライブラリは充実していますねぇ。

 で、一般的にこれっぽいことをするにはどうするのかを調べたら、Rubyの実装例が見つかりました。

def gaussian()
   sum = 0.0
   12.times{ sum += rand() }
   return sum - 6
end

 乱数を12回足して6を引くと不思議なことに正規分布を返します。おもしろいですねぇ。

 区間[0,1]の一様乱数の分散は 1/12 だそうで、12個足し合わせて無理やり分散を 1 にしています。最後に平均が 0 になるように 6 を引いています。

◆1/12を確かめる

 区間[0,1]の一様乱数の分散が 1/12 であることは気になります。分散の定義から検証してみたいと思いました。

 分散はデータのばらつき度合を示す指標で equ.1 を使って計算できます。

f:id:jun930:20191224100421p:plainequ.1

 区間[0,1]の一様乱数の平均は 1/2 ですから、( 1/2 - x )2区間[0,1]で定積分すれば良いと思われます。

f:id:jun930:20191224100454p:plain

 おおっ、1/12 になりました!

 分散はデータの二乗平均から平均の二乗を引くことでも求めることができますので、こちらも検証してみましょう。二乗平均は x2区間[0,1]で定積分します。平均の二乗は 1/2 の二乗です。

f:id:jun930:20191224100515p:plain

 おおー、これもちゃんと 1/12 になっています。(あたりまえか・・・)

◆この際だからプログラムでも確かめちゃう

 以下はRubyのコードです。いっぱい回してみます。

n = 1000000
s = 0
n.times{
  r = rand()
  s += (r - 0.5) * (r - 0.5)
}

puts s/n

 0.08338865747202297 こんな数値が出ました。

 乱数の分散なんてあまり考えたこともなかったので 1/12 とか言われちゃうと気になります。とりあえず気が済みました。忘れないように書きました。