Skip to content
Vamshi Jandhyala

Books · The Riddler

Chapter 48

How Close To The Bullseye Can Robin Get?

Robin always hits the circular target, uniformly at random over its area. She fires arrows as long as each lands closer to the center than the one before; her score is the number of arrows fired, including the first one that breaks the streak. On average, what score can she expect? Extra credit: with ten concentric circles of radii 1,2,,101,2,\dots,10, she instead needs each arrow inside a smaller circle than the last. Now what is her expected score?

The Riddler, FiveThirtyEight(original post)

Solution

The plain target. Only the order of the arrows’ distances matters, and those distances are independent and continuous, so every order is equally likely. The streak survives through kk arrows exactly when their distances are strictly decreasing, which happens with probability 1k!\tfrac{1}{k!} (one decreasing order out of k!k!). The score exceeds kk with that probability, so E[score]=k=0Pr(score>k)=k=01k!=e2.718.\mathbb{E}[\text{score}] = \sum_{k=0}^{\infty}\Pr(\text{score} > k) = \sum_{k=0}^{\infty}\frac{1}{k!} = \boxed{e} \approx 2.718.

The ringed target. Now an arrow counts by which ring it lands in: ring ii (between radii i1i-1 and ii) has area fraction pi=i2(i1)2102=2i1100p_i = \tfrac{i^2 - (i-1)^2}{10^2} = \tfrac{2i-1}{100}. A streak of kk arrows means kk distinct rings hit in strictly decreasing order, one order per choice of rings, so Pr(score>k)\Pr(\text{score} > k) is the elementary symmetric sum ek(p1,,p10)e_k(p_1,\dots,p_{10}). Summing all of them telescopes into a product: E[score]=k=010ek(p)=i=110(1+pi)=i=110(1+2i1100)2.56.\mathbb{E}[\text{score}] = \sum_{k=0}^{10} e_k(p) = \prod_{i=1}^{10}\big(1 + p_i\big) = \prod_{i=1}^{10}\Big(1 + \tfrac{2i-1}{100}\Big) \approx \boxed{2.56}. Coarser rings make ties common, which cuts the streak shorter than the sharp-distance value ee.

The computation

Fire the arrows: for the plain target compare exact distances; for the ringed target compare ring indices (ring =10u= \lceil 10\sqrt{u}\rceil for a uniform area fraction uu). Average the streak length, and evaluate the product.

import numpy as np
from math import prod, ceil, sqrt
rng = np.random.default_rng(0)
def expected(ringed, runs=2_000_000):
    total = 0
    for _ in range(runs):
        prev = ceil(10*sqrt(rng.random())) if ringed else rng.random()
        score = 1
        while True:
            cur = ceil(10*sqrt(rng.random())) if ringed else rng.random()
            score += 1
            if cur < prev: prev = cur
            else: break
        total += score
    return total / runs
print(expected(False))                       # ~2.718 = e
print(expected(True))                         # ~2.56
print(prod(1 + (2*i - 1)/100 for i in range(1, 11)))   # 2.5585...