Problem 5 of Monte Carlo solutions to Fifty Challenging Problems...

(This is another part of the Fifty Problems series, a set of example applications of Monte Carlo methods. In each post, I present source code which answers a probabilistic question using simulated models of the underlying system.)

Draw a grid of 1" squares on a table, then toss a penny (diameter 3/4") onto it. What's the probability the penny doesn't cross any line on the table? (Now, turn this into a carnival game and make some money.)
#!/usr/bin/env ruby

TRIALS=10000

# The goal in this one is to determine the probability
# that the coin is inside the square.  We can model
# this one of two ways: the probability of crossing 
# a line, or the probability of not crossing any lines.
#
# P(crossing a line) is pretty hard, with four different
# cases to consider (unless you model the grid in a
# slightly inside-out way.  After going through the below,
# think of how you could rework the setup to model crossing
# either line in the same manner.)
#
# Instead, we model the problem as
# P(not crossing a line)
#
# We model the coin as a point (x,y), with a circle 
# drawn 3/8" around it, yielding a diameter of 3/4".
#
# Thus, to win, you must have x and y in the 
# range [3/8,5/8].
#
RANGE_LOW = 3.0/8.0
RANGE_HIGH = 5.0/8.0

def win()
	x = rand()
	y = rand()
	return ( (x > RANGE_LOW) && (x < RANGE_HIGH) &&
		 (y > RANGE_LOW) && (y < RANGE_HIGH) )
end

wins = 0

TRIALS.times {
	wins +=1 if win()
}

puts "Out of #{TRIALS} coin tosses, we won #{wins}."
puts "The probability of winning is approximately #{wins.to_f/TRIALS.to_f}"

I've been coding my way through Fifty Challenging Problems in Statistics with Solutions. This post is a part of the Fifty Challenging Problems series.

This was brought to you by Josh Myer. He has other fun things at his homepage.