Problem 7 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.)

Mr Brown has a problem: he compulsively puts a dollar on number 13 in American roulette. To help him see the error of his ways, Mr Pink gives him a bet: Pink bets Brown $20 if, after 36 rounds of roulette, Brown is ahead. (That is: if Brown is up after 36 compulsive rounds, he gets an extra $20; if he's behind, he loses an extra $20.)
#!/usr/bin/env ruby

# We'll play from Mr Brown's perspective.
#
# Modelling this game is tricky.  We need to play 36
# rounds of roulette, then see if we're up.  If so,
# we get an extra $20; if not, we lose $20.  At the
# end, we want the expected payout per unit stake.

TRIALS=10000

def payout()
	p = 0
	36.times do
		p += 36 if ( rand() < 1/38.to_f)
	end
	if p > 26
		p += 20
	else
		p -= 20
	end

	# puts "This round: $36 in, $#{p} out\n"
	p
end

total_payout = 0
total_bet = 0

TRIALS.times {
	total_payout += payout()
	total_bet += 36
}

puts "After #{TRIALS} rounds of betting, we bet #{total_bet}"
puts "We won #{total_payout}, so the expected loss is "
puts "  $#{(total_bet-total_payout)/total_bet.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.