Problem 45 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 45: Let us shuffle two decks of cards and lay them out in two lines, one over the other. On average, how many cards will "line up" with themselves (ie: the 3 of clubs over the 3 of clubs)?
#!/usr/bin/env ruby

TRIALS=10000

deck = (0..51).to_a

# We shuffle the deck, then shuffle another.  We then walk the
# two arrays together, looking for matches.

match = 0

TRIALS.times do
  upper = deck.shuffle
  lower = deck.shuffle

  upper.each_with_index do |u_i, i|
    l_i = lower[i]
    match += 1 if l_i == u_i
  end
end

puts "Out of #{TRIALS}, #{match} cards matched."
puts "That gives us an expected number of matches as: "
puts "  #{match.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.