Problem 17 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.)
Problem 17: In a jousting tournament, there are two twins: Balan and Balin. If there are 8 knights total, all equally matched, and the initial ladder is randomly assigned, what's the probability of the twins jousting against each other?
#!/usr/bin/env ruby
TRIALS=100000
# Array of Knighs: BalIn and BalAn, and some schmucks.
KNIGHTS=["I","A","X","X","X","X","X","X"]
# The knights are equally matched, so we need to randomize
# the selection of who wins each round. Otherwise, this is
# very similar to problem16.rb.
# We're going to abuse the weak typing of ruby here. Don't
# do this for real.
#
# Returns an array if we just continue on, returns nil if the
# brothers meet.
#
def round(seedings)
next_round = []
# Walk the seedings pairwise, looking for "A" and "I"
# Note that order doesn't matter.
i = 0
while (i < seedings.length())
return nil if (["A","I"] & seedings[i..i+1]).length == 2 # rubylicious.
next_round.push( seedings[i + rand(2)] )
i += 2
end
return next_round
end
def tourney()
first_round = KNIGHTS.shuffle
quarters = round(first_round)
return true if !quarters
semi = round(quarters)
return true if !semi
final = round(semi)
return true if !final
return false # tourney over
end
srand() # Our first call to shuffle is before our
# first call to rand()...
n_match=0
TRIALS.times do
n_match += 1 if tourney()
end
puts "In #{TRIALS} trials, the brothers met #{n_match} times."
puts "P=#{n_match/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.