My kids’ new favorite game is Outfoxed. Everyone works together to try to identify the fox guilty of stealing a pie. Sort of a mash up of Clue and Guess Who.
In order to make either of two moves (find a clue or reveal suspects), a player has to roll three dice and have them all come up “eyeballs” (for suspects) or “paw prints” (for clues) — each six-sided die has 3 of each, so 50/50 chance to roll either. You have to decide ahead of time which set of three you’re trying to roll, and you get three chances to get all three. After each roll, you can set aside any dice that are what you’re going for; subsequent rolls only involve the remaining dice.
It wasn’t obvious to me at the outset how hard it would be to successfully roll, but after playing for a little bit, it was pretty clear that you were more likely to be successful than not. So I wanted to try to figure out how the odds were stacked. The rolling scheme is sufficiently complicated that I couldn’t figure out any sort of clever solution, but it’s not too complex that you can’t brute force all the possibilities. So that’s what I did:
So I broke out all the possible roll combinations and the associated likelihood for each (note, since we may roll anywhere from one to three times, each outcome is not equally likely). To check my math, I summed up all the probabilities and got unity, so I’m optimistic I did it right. The odds are that you’ll be successful on just a skosh more than 2 out of 3 turns (67%).
It never hurts to double check. So in addition to this sort of derived approach, I went for a Monte Carlo approach as well. It only took a little bit of python to confirm the numbers that I got previously. I also confirmed an additional little detail. When successful rolling paws for the purposes of finding clues, the average (mean, median, and mode!) number of paws is exactly 4 (note: 3 of the sides of each die have paws; 2 of the sides have a single paw and 1 side has two paws).
import random random.seed(19) die = [0, 0, 0, 1, 1, 2] def roll(ndice): dice = [] for i in range(ndice): dice.append(die[random.randint(0,5)]) return dice def get3(): paws = 0 ndice = 3 for i in range(3): dice = roll(ndice) for i in range(ndice): if dice[i] > 0: paws = paws + dice[i] ndice = ndice - 1 if ndice == 0: return paws return 0 nturns = 100000 success = 0. fail = 0. paws = 0. for i in range(nturns): outcome = get3() if outcome == 0: fail = fail + 1 else: success = success + 1 paws = paws + outcome print 'Success: ',success/nturns print 'Failure: ',fail/nturns print 'Avg. Paws: ',paws/success