Problem 16 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 16: A tennis tournament of 8 players has the initial ladder chosen at random. Assuming the best player beats everyone, and the second-best player beats everyone else, what's the chance that the second-best player wins runner-up?
#!/usr/bin/env ruby

TRIALS=100000

# Here we get into some slightly gnarly modelling.
#
# We'll model the current stage of competition as an array 
# of ranks:

PLAYERS=[1,2, 3,3, 3,3, 3,3]

# Then, we run a round of the game as follows:
def round(seedings)
  next_round = []

  i = 0
  while i < seedings.length
    a = seedings[i]
    b = seedings[i+1]

    winner = a < b ? a : b # ranks, so lower wins
    next_round.push(winner)
    i += 2
  end

  return next_round
end

def second_runner_up(first_round)
  quarters = round(first_round)
  semis = round(quarters)
  return semis.include?(2)
end

n_second_runner_up = 0

TRIALS.times do
  srand  # There's a fun story here... guess what it is.
  seeding = PLAYERS.shuffle
  n_second_runner_up += 1 if second_runner_up(seeding)
end

puts "Out of #{TRIALS} brackets, #2 was runner up "
puts "  #{n_second_runner_up} times.  "
puts "  P = #{n_second_runner_up/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.