Library · Geometric Probability · Chapter 9

An n-gon from a broken stick

Revised Report an error

Problem 9.1

For an integer n≥3n \geq 3, a unit stick is broken at n−1n - 1 independent uniform random points, producing nn pieces. What is the probability that the nn pieces can be reassembled to form a (non-degenerate) nn-gon?

Solution. Let s1,s2,…,sns_1, s_2, \ldots, s_n be the piece-lengths, so ∑si=1\sum s_i = 1 and si≥0s_i \geq 0. The pieces can form a non-degenerate nn-gon iff each is less than the sum of the others: si<∑j≠isj=1−si      ⟺      si<12 for every i.s_i < \sum_{j \neq i} s_j = 1 - s_i \;\;\iff\;\; s_i < \tfrac{1}{2} \text{ for every } i.

We compute P(some si≥12)\mathbb{P}(\text{some } s_i \geq \tfrac12) by inclusion–exclusion. Let Ai={si≥12}A_i = \{ s_i \geq \tfrac12 \}. Each piece sis_i marginally has density (n−1)(1−s)n−2(n-1)(1-s)^{n-2} on [0,1][0, 1] (Beta(1,n−1)(1, n-1)), so P(Ai)=∫1/21(n−1)(1−s)n−2 ds=(1−12)n−1=12n−1.\mathbb{P}(A_i) = \int_{1/2}^{1} (n-1)(1-s)^{n-2} \, ds = (1 - \tfrac12)^{n-1} = \frac{1}{2^{n-1}}.

The events AiA_i are mutually exclusive (two pieces cannot both exceed 12\tfrac12, since their sum would exceed 11). Hence by addition, P(some si≥12)=n⋅P(A1)=n2n−1.\mathbb{P}(\text{some } s_i \geq \tfrac12) = n \cdot \mathbb{P}(A_1) = \frac{n}{2^{n-1}}.

Therefore P(n-gon)=1−n2n−1.■\boxed{\mathbb{P}(n\text{-gon}) = 1 - \frac{n}{2^{n-1}}.} \qedhere

For n=3n = 3 (triangle) the probability is 14\tfrac14; for n=4n = 4 (quadrilateral) it is 12\tfrac12; for n=5n = 5 (pentagon) it is 1116\tfrac{11}{16}. The probability tends to 11 as n→∞n \to \infty — intuitively, when a stick is broken into many pieces, “short enough pieces” becomes automatic. This generalises the n=3n = 3 case of Chapter 2 (whose complement is the n=3n = 3 instance here).

The result is cited frequently on math.stackexchange, usually as a classroom exercise illustrating inclusion–exclusion in the simplex.

import numpy as np
# Break stick at n-1 uniform points; check if all n pieces < 1/2.
for n in [3, 4, 5, 6]:
    pts = np.sort(np.random.rand(n-1, 10**6), axis=0)
    spacings = np.vstack([pts[:1], np.diff(pts, axis=0), 1 - pts[-1:]])
    ngon = (spacings < 0.5).all(axis=0)
    print(f"n={n}: sim={ngon.mean():.5f}   exact={1 - n/2**(n-1):.5f}")
# n=3: sim=0.24987  exact=0.25000
# n=4: sim=0.49910  exact=0.50000
# n=5: sim=0.68732  exact=0.68750
# n=6: sim=0.81286  exact=0.81250
Report an error on this page

Reports are stored by Netlify. See the privacy note.