モンテカルロ法による、円周率計算(Ruby) [Ruby]
別記事で紹介した、モンテカルロ法による円周率の計算ですが、BASICでは計算速度が遅いので、C++でプログラムを書いてみました。しかし、速度的にはある程度まで早くなりましたが、計算精度があまりよくないのも事実です。
そこで、速度はあまり速くないが、計算精度が期待できるRubyでプログラムを書いてみました。
─────
#! ruby -Ks
#
# 2012.04.07 ───── coded by 心如
Kai = 10000000
st = Time.now
s = 0
100.times do |j|
cnt = 0
(4 * Kai).times do
x = rand()
y = rand()
r = (x**2 + y**2)**0.5
cnt += 1 if(r < 1.0)
end
puts "#{j}: #{cnt} [#{Time.now - st}sec]"
s += cnt
end
puts s
─────
上記の出力は、試しに4億回の計算をした結果です。pi=3.141592654に対して、5桁の精度は出ています。しかし、4億回の計算に約879秒掛かっています。40億回の計算を行うには、単純計算で8,787秒(約2時間半)かかることになります。
Rubyのような使い勝手がよいプログラミング言語で、C/C++コンパイラのような実行速度の速いプログラミング言語があればよいなと思うのは私だけでしょうか?
(by 心如)
【追記】
Rubyで書いたプログラムで、C++で書いたプログラムと同じ回数(40億回)だけ計算してみました。もっと高い精度になるかも知れないと過大な期待を抱いていましたが、見てのとおり、やっぱり5桁の精度しかありません。モンテカルロ法というのは、この程度のものだということをよく憶えておこうと思いました。
コメント 0