Books · The Fiddler: Solutions
Chapter 39
How Low (or High) Can You Go?
In “high-low” you see a sequence of independent uniform numbers and, before each new one, guess whether it will be higher or lower than the previous. The optimal rule is to guess “high” when the last number is below and “low” when it is above. Playing this way, what is the probability you earn at least two points, that is, you correctly compare to and then to ?
The Fiddler, Zach Wissner-Gross, September 5, 2025(original post)
Solution
Condition on the middle value . Given , the two comparisons are independent: the second is correct with probability , and integrating the first over gives for and for . Hence
The computation
Play the game: draw three numbers, apply the optimal rule (guess high if the previous is below , else low) on both comparisons, and take the fraction of rounds scoring both.
import numpy as np
rng = np.random.default_rng(0); M = 8_000_000
x1, x2, x3 = (rng.random(M) for _ in range(3))
ok = lambda p, n: np.where(p < .5, n > p, n < p) # high if prev<.5 else low
print(round((ok(x1, x2) & ok(x2, x3)).mean(), 5)) # 0.5417 = 13/24
Extra Credit
A friend has been playing forever and amassed a huge score. Given only that, what is the probability they win the next round?
Solution
A long survivor sits at a value drawn from the game’s quasi-stationary distribution. The kernel that carries a surviving value to the next is ; its leading eigenfunction is on (symmetric about ), and substituting back forces . The per-round survival probability, which is exactly the chance of winning the next round, is the eigenvalue (The source value is paywalled; this closed form is my own.)
The computation
Discretise the survival kernel on a fine grid and power-iterate to its leading eigenvalue: that eigenvalue is the long-run per-round survival probability, the chance the veteran wins again.
n = 2000; xs = (np.arange(n) + .5) / n; dx = 1 / n
K = np.zeros((n, n))
for i, v in enumerate(xs): K[i, (xs > v) if v < .5 else (xs < v)] = 1.0
w = np.ones(n)
for _ in range(20000):
w2 = (K.T @ w) * dx; lam = w2.sum() / w.sum(); w = w2 / np.linalg.norm(w2)
print(round(lam, 4), round(1/(2*np.log(2)), 4)) # 0.7211 (n=2000) -> 0.7213