【乱数で】モンテカルロ法を試してみた。【数値計算】

モンテカルロ法の本を見つけて、読んでいたらうずうずしてきて試したくなたーw

モンテカルロ法 - Wikipedia


今回はここのページの円周率を求める方法を参照してみたv

http://www.geocities.jp/turtle_wide/softcomp/al/p03.htm


大切なのはここ。

π = 扇の面積/正方形の面積 * 4
となります.すなわち,扇の面積と正方形の面積の比を4倍すればよいということになります.


http://www.geocities.jp/turtle_wide/softcomp/al/p03.htm


ここからRubyのソースに落とす!!
(元のjavaは読めるだけで書けないよ、うわあん)


引数の数字の回数だけシミュレートします。
(引数を複数書けば、複数の精度の結果を吐きます)

exit() if ARGV.size == 0

ARGV.each{|n|
	
	n = n.to_i
	cin = 0
	
	n.times{|i|
		
		x = rand()
		y = rand()
		
		cin = cin + 1 if (Math::sqrt(x**2 + y**2) <= 1)
	}

	print "#{n} -> "

	cin = cin.prec_f
	n   = n.prec_f
	puts (cin/n) * 4
}


はい、ちなみに結果は

10 -> 3.2
100 -> 3.32
1000 -> 3.108
10000 -> 3.1304
100000 -> 3.14392
1000000 -> 3.144464

(乱数生成回数 -> 結果)


そこそこ出してますね。
積分計算に比べたら非効率ですが
・・・なんかロマンみたいなものがありませんか?乱数でシミュレーションするってことにw


あー、楽しかった。ねよ