モンテカルロシミュレーション

作成:2000-04-06

更新:2000-10-04


モンテカルロっていうのは、あのギャンブルで有名なモンテカルロで、

ギャンブルといえばサイコロ、といえば乱数

というわけで、乱数を用いて多数回ループさせて、モデルの挙動を解析する手法をモンテカルロシミュレーションといいます。

本などによくあるのが、円周率を求めよう というやつで、半径1(面積=π*1*1=π)の円の内部の方程式は x*x + y*y <= 1 なので、

0.00〜1.00の乱数をまず2つ発生させ、x、yとして x*x + y*y <=1.0 を満たすかどうかを判別し、何回円の内部に入ったかを計算するわけですね。

つまり

monte1.png この様な1/4円の面積はπ/4なので
mote1000.png

たとえば1000回乱数 x、y を発生させ、円の内部に入ったかどうかを

x*x + y*y <= 1 ?

で判定してみると

1000回中783回入ったので

783/1000*4 = 3.132
となり、π=3.14159に近い値が得られる。

ちなみにこれは10000回ループだ(笑)
単なる塗りつぶしに近い。

どうせ殆ど塗りつぶしになるんだったら、例えば同じ1000回でもこんな風に、乱数ではなくて均等割にしたほうが、毎回同じ数が得られるのでいいんじゃないか?

 

ところが実際やってみると

Monte Carlo n=1000
乱数    均等割

3.092000 3.199219 o
3.028000 3.199219 x
3.156000 3.199219 o
3.196000 3.199219 o
3.188000 3.199219 o
3.144000 3.199219 o
3.080000 3.199219 x
3.144000 3.199219 o
3.160000 3.199219 o
3.200000 3.199219 x

となって、乱数の方が均等割りよりもπの値に近く出るほうが多い。

これはなんというか、均等割りというのは離散値化というかデジタル化になるわけで、乱数の方が、離散値化の癖が出にくいというかなんというか。

むろん乱数の精度にもよるんですがね。


モンテカルロシミュレーションプログラムの実際

MaTX SCILABでモンテカルロ

C言語 ( LSIC-86 )でモンテカルロ

Perlでモンテカルロ(メールマガジンネタ)


正規分布する乱数によるモンテカルロシミュレーション