Books · The Fiddler: Solutions
Chapter 22
Bingo!
A bingo card is a grid of numbered squares with a free, pre-marked square in the very centre. Numbers are called one at a time, uniformly at random and without replacement; you mark a square when its number is called. You win on getting a full line, across, down, or along a main diagonal. Start with the version: a free centre surrounded by eight numbered squares. On average, how many markers do you place before you get bingo?
The Fiddler, Zach Wissner-Gross, January 23, 2026(original post)
Solution
Label the squares with F the free centre, already marked. The eight winning lines are the three rows, three columns and two diagonals. Four pass through the centre (middle row, middle column, both diagonals) and need only their two outer squares; the four outer lines need all three of their squares. The eight numbered squares are called in a uniformly random order, and we want the expected position of the first call that completes a line.
With only orderings, the average is exact by direct enumeration: A line through the centre finishes as soon as both of its two squares appear, which tends to happen early, pulling the average just below .
The computation
Enumerate all call orders. For each, mark squares one by one (the centre starts marked) and record the position at which a line first completes; average those positions.
import itertools as it
from fractions import Fraction as F
lines = [(0,1,2),(6,7,8),(0,3,6),(2,5,8),(3,4,5),(1,4,7),(0,4,8),(2,4,6)]
nums = [c for c in range(9) if c != 4] # 4 = free centre
tot = 0
for perm in it.permutations(nums):
marked = {4}
for t, c in enumerate(perm, 1):
marked.add(c)
if any(all(x in marked for x in L) for L in lines):
tot += t; break
print(F(tot, 40320)) # 243/70 = 3.4714...
Extra Credit
Return to the full card: a free centre and numbered squares, with the twelve winning lines being five rows, five columns and the two main diagonals. On average, how many markers until bingo?
Solution
The four lines through the centre again get a head start. Enumerating all orderings is hopeless, but a Monte Carlo over random call orders converges quickly to (The source’s value is behind its paywall; this estimate is my own, from simulated cards.)
The computation
Simulate random call orders for the card: mark squares until some row, column, or main diagonal is complete, and average the marker count over millions of cards.
import numpy as np
cells = [(r, c) for r in range(5) for c in range(5)]
free = (2, 2); nums = [x for x in cells if x != free]
idx = {c: i for i, c in enumerate(cells)}
lines = ([[(r, c) for c in range(5)] for r in range(5)] +
[[(r, c) for r in range(5)] for c in range(5)] +
[[(i, i) for i in range(5)], [(i, 4 - i) for i in range(5)]])
L = [[idx[c] for c in ln] for ln in lines]
rng = np.random.default_rng(0); T = 2_000_000; s = 0
for _ in range(T):
order = rng.permutation(24); m = np.zeros(25, bool); m[idx[free]] = True
for t in range(24):
m[idx[nums[order[t]]]] = True
if any(m[ln].all() for ln in L): s += t + 1; break
print(round(s / T, 3)) # ~13.61