ファイル書き込みの練習も兼ねて、計算した値をファイルに書き込んでみる
円周率を計算で近似するために、モンテカルロ法を使用してみました
モンテカルロ法とは?
簡単に説明すると、
「乱数を用いて数値を見積もる計算方法」
らしいです。
つまり乱数(でたらめに点を打つ)なので、例えば2cm X 2cm の正方形とその中に半径1cmの円があったとして、正方形の中にでたらめに点を打った時に、円の中にある点の個数と全体の点の個数の比が面積に比例すると考えられるから、円周率が求められますよということ。
今回は1辺が1cmの正方形の中に、半径が1cmの1/4円を描き、点を10000個打ち(乱数をx軸、y軸でそれぞれ10000個発生)、円の中に入るかどうかで判定しました。
円の中に入るかどうかの判定は、 x*x + y*y <= 1
扇型の面積は、 1/4 * 1*1 * π = π/4
正方形と扇型の面積比は、 1 : π/4
発生させた点の個数(count)と扇型の中にある点の個数(count_in)の比は、 count : count_in = 1 : π/4
すると、円周率は π = 4 * count_in / count として計算できる
生成した乱数はMonte Carlo method.csvに、又その中から扇型の中に生成された点をpi.csvに保存します
monte.rb
puts "Monte Carlo method.csvを作成します"
puts "pi.csvを作成します"
file = File.open("Monte Carlo method.csv", "w")
file2 = File.open("pi.csv", "w")
puts "乱数を10000行分生成します"
count = 0
count_in = 0
10000.times do
count += 1
x = Random.rand # 発生させた乱数をxに代入
y = Random.rand # 発生させた乱数をyに代入
puts "#{x},#{y}" # x,yを画面に表示
file.puts "#{x},#{y}" # x,yをファイルに書き込み
if x**2 + y**2 <= 1
count_in += 1
pai = 4.0 * count_in / count
file2.puts "#{count_in}, #{pai}"
end
puts count
puts count_in
puts pai
end
puts "乱数をMonte Carlo method.csvに保存しました"
puts "paiの近似値をpi.csvに保存しました"
file.close
file2.close
これで何回か計算してみたところ、3.14に近い値を得ることができました