Calculate Π By Throwing Ruby Tipped Darts
Erm, I rewrote this in ruby:
#!/usr/bin/env ruby
# $Id: MonteCarlo.rb 146 2010-10-14 20:43:47Z sam $
# Our main class
class MonteCarlo
# We will automagically generate reader methods for these attributes
attr_reader :pi, :count, :hits
# Constructor: set everything to zero before we start
def initialize
@hits = 0;
@count = 0;
@pi = 0;
end
# We call this method for every throw
def increment hit
# We always clock up another throw
@count = @count + 1
# And accumulate a hit if we scored one
@hits = @hits + 1 if hit
# Then calulate a new value of pi
calcpi
end
# Represent ourself as a string
def to_s
sprintf "Throws: %10d, Hits: %10d, Pi: %10f, Actual Pi: %10f", self.count, self.hits, self.pi, Math::PI
end
# Mark off the private elements of this class
private
# Calcluate pi
def calcpi
# explanation can be found here: https://icanhaz.com/montecarlo
@pi = 4.0 * ((@hits.to_f) / (@count.to_f))
end
# Class ends
end
# Class representing a single throw of a dart
class Throw
# Constructor: we only do one thing, so we may as well do it here (I'm sure
# it's woefully inefficient to construct a new instance every time, but never
# mind)
def initialize
# Generate two random coordinates (between 0 and 1)
@x = rand
@y = rand
# The distance from the origin will be the hypotenuse of a right-angled
# triangle with sides of length x and y. So from Pythagoras, we see that:
#
# @distance = sqrt((x^2) + (y^2))
#
# which translates into Ruby as:
@distance = ((@x * @x) + (@y * @y))**0.5
end
# Method to determine whether our dart landed inside the quadrant
def hit?
# Return true if distance from origin is 1.0 or less
@distance <= 1.0
end
# Class ends
end
# Main code starts here
#
# First, contruct a new MonteCarlo object
mc = MonteCarlo.new
# Loop forever
while 1 do
# Every iteration, make a new Throw, see if we scored a 'hit', then hand this
# as the parameter as we increment the count of total throws
mc.increment Throw.new.hit?
# Output every 1000th iteration
puts mc if mc.count % 1000 == 0
end
The source was on my Subversion server, now lost to the mists of time.