LoginSignup
0
0

More than 5 years have passed since last update.

Rubyで円周率を計算してみた

Posted at

ファイル書き込みの練習も兼ねて、計算した値をファイルに書き込んでみる

円周率を計算で近似するために、モンテカルロ法を使用してみました

モンテカルロ法とは?

簡単に説明すると、

「乱数を用いて数値を見積もる計算方法」

らしいです。
つまり乱数(でたらめに点を打つ)なので、例えば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 として計算できる

イメージ
alt

生成した乱数は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に近い値を得ることができました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0