def distance(x,y) Math.sqrt(x * x + y * y) end def in_circle(x,y) distance(x,y) < 1 end def random_point rand * 2 - 1 end def pi_from_proportion(nr_trials, nr_within_circle) # Square's area is 4, Circle's area is PI. So PI = (nr_within_circle / nr_trials.to_f) * 4 end original_time = Time.now nr_within_circle = 0 1.upto(100_000_000) do |nr| x,y = random_point, random_point nr_within_circle += 1 if in_circle(x,y) if nr % 1_000_000 == 0 puts "After #{nr} trials: #{pi_from_proportion(nr, nr_within_circle)}" end end puts "Calculated in #{Time.now - original_time} seconds."