3 min read

Riddler Classic: The Three Deck Monte

Should You Take the Three Deck Monte Bet?

This week’s FiveThirtyEight Riddler Classic is about whether you should play “Three Deck Monte” on a street corner. You pick one of three decks offered with all cards visible, and your opponent then picks one of the two others. After shuffling each deck you compete in a game similar to War. You each turn over cards one at a time, the one with a higher card wins that turn, and the first to win five turns wins the game. The decks look like this:

  • Red deck: four aces, four 9s, four 7s
  • Blue deck: four kings, four jacks, four 6s
  • Black deck: four queens, four 10s, four 8s

Should you play the game?

Simulating the Game

My approach to finding the solution is to simulate each of the six possible match ups, knowing that your opponent will pick the deck that offers the highest probability of winning the game. We run 100,000 replications of each of the six match ups and plot the results below. The heatmap shows the mean probability of winning. We also calculate the standard deviation, so we can compute the error around that mean.

game <- function(mydeck, hisdeck) {
decks <- list(
  Red=c(14, 14, 14, 14, 9, 9, 9, 9, 7, 7, 7, 7),
  Blue=c(13, 13, 13, 13, 11, 11, 11, 11, 6, 6, 6, 6),
  Black=c(12, 12, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8) )

my_hand  <- sample(decks[[mydeck]], 12)
his_hand <- sample(decks[[hisdeck]], 12)

min(which(cumsum(my_hand > his_hand)==5)) < min(which(cumsum(my_hand < his_hand)==5))

meansd <- function(x) return(c(mean(x), sd(x)))

sim_games <- function(mydeck, hisdeck, count) {
 c(mydeck, hisdeck, meansd(replicate(count, game(mydeck, hisdeck))))

sim_all <- function(count) {
results <- data.frame( rbind(
    sim_games('Red','Blue', count),
    sim_games('Red','Black', count),
    sim_games('Blue','Red', count),
    sim_games('Blue','Black', count),
    sim_games('Black','Blue', count),
    sim_games('Black','Red', count) ))
colnames(results) <- c('mydeck','hisdeck','Wins','sd')
results$Wins <- as.numeric(as.character(results$Wins))
results }

results <- sim_all(100000)

ggplot(results, aes(x=hisdeck,y=mydeck,fill=Wins)) + geom_tile() +theme_bw(base_size = 14) +coord_fixed() + theme(panel.grid.major = element_blank()) +labs(title='FiveThirtyEight Riddler Classic',subtitle='Should You Take the Three Deck Monte Bet?',caption="by: @cortinah, 2/2/2019",
  x='His Deck', y='My Deck') +scale_fill_continuous('My\nwin\nprob')

Don’t Play This Game!

As the heatmap shows, no matter what deck you chose, your opponent can choose a deck that gives him approximately 70% chance of winning. For example, if you choose the red deck, he can then choose the blue deck, giving him 70% odds of winning, and so on. As a check on the reliability of the results we use the

\[ \sigma_{m}=\frac{\sigma}{\sqrt{N}} \]

formula to compute the standard error of those means. For example if your opponent plays optimally you probability of winning is only 29.7% +/- 0.1%. So don’t play this game…
My deck His Deck My Win % Std Error
Red Blue 70.0 0.1
Red Black 29.7 0.1
Blue Red 29.8 0.1
Blue Black 70.2 0.1
Black Blue 30.0 0.1
Black Red 70.4 0.1