Library · The Fiddler: Solutions · Chapter 134
Can You Race Around the Monopoly Board?
The game of Oligopoly is played on a square board of spaces numbered to . Every player starts on space and on each turn rolls two dice and moves forward that many spaces. Unlike Monopoly, nothing else ever moves you: no cards, no jail. On their first pass around the board, which space from to are players most likely to land on at some point (not necessarily on the first roll)?
The Fiddler, Zach Wissner-Gross, December 1, 2023(original post)
The official solution appeared in the post of December 8, 2023 and gives space , with probability about percent, for the main puzzle, and space (and space with three dice) for the Extra Credit. All agree with the answers below.
Solution
Write for the chance that two dice total . Of the equally likely rolls, total , so Write for the chance of landing on space at some point during the first pass, with because everyone starts there.
The token only ever moves forward, so if it lands on there is exactly one space it stood on just before, some , followed by a roll of exactly . These possibilities, one for each , cannot happen together, and the roll made from does not depend on how the token got there. So counting for negative . Each value comes from the eleven before it. The first few are and continuing the same way:
Up to space the peak is space , with
What about later spaces? From on, all eleven weights appear in the formula, and they add up to . So is a weighted average of the eleven values before it, and an average can never exceed the largest thing it averages. For those eleven values are , all at most , so . The same holds for , whose window has moved on by one, and so on along the board: no later space ever catches up with space . In fact the values settle down to about . The average roll is , so in the long run the token touches one space in seven.
The computation
The program does not use the formula above. It follows the game roll by roll: it keeps the exact probability of every position after one roll, after two, and so on, until every position has passed . A position is never visited twice, so adding up the chance of being on space after each number of rolls gives the chance of ever landing there.
from fractions import Fraction
from itertools import product
from collections import Counter
def landing(dice):
roll = Counter(sum(t) for t in
product(range(1, 7), repeat=dice))
total = 6 ** dice
ever = Counter()
now = {0: Fraction(1)} # position -> chance
while now:
nxt = Counter()
for pos, pr in now.items():
for k, c in roll.items():
if pos + k <= 39: # still on the first pass
nxt[pos + k] += pr * Fraction(c, total)
ever.update(nxt)
now = nxt
return ever
p = landing(2)
best = max(range(1, 40), key=lambda n: p[n])
print("most likely:", best, p[best], float(p[best]))
It prints
most likely: 7 1417/7776 0.18222736625514405
Extra Credit
The board has spaces per side, so the first side is spaces to . Setting the first side aside, which space from to is least likely to be landed on during the first pass? What if you rolled three dice instead of two?
Solution
The table of from the main puzzle, carried on to space , answers it. After the first side the values run and from space on they stay between and , closing in on . So the low point is space .
The reason is visible in the chart. A single roll reaches at most , so space is the first space that always needs two or more rolls. Two rolls favour totals near , and sits on their lower flank. Spaces just before it still get a share from single rolls, and spaces just after it get the full benefit of two rolls. Space falls into the gap between the two humps. Its exact chance is
With three dice the same thing happens one hump later. A single roll of three dice totals at most and seldom more than , and two rolls centre on , so the gap falls in the high teens. The exact table, from the computation below, puts the low point at space with probability about percent, just under space at about percent. Their difference is small enough that only exact arithmetic settles it:
The computation
The function from The computation above handles any number of dice. Ask it for the least likely space after the first side, with two dice and with three.
for dice in (2, 3):
p = landing(dice)
low = min(range(10, 40), key=lambda n: p[n])
print(dice, "dice: least likely", low,
f"{float(p[low]):.4f}")
It prints
2 dice: least likely 13 0.1247
3 dice: least likely 17 0.0763