Chapter 11
Should You Shoot Free Throws Underhand?
Hark! The NCAA Tournament starts next week, and the “granny shot” has reappeared as a free throw technique. Its proponents claim that it improves accuracy because there are fewer moving parts: the elbows and wrists are held more stable, for example, and the move is symmetric because one’s arms are, more or less, equal length. Let’s find out how effective the granny shot really is.
Consider the following simplified model of free throws. Imagine the rim to be a circle (which we’ll call ) that has a radius of , and is centered at the origin (the point ). Let be a random point in the plane, with coordinates and , and where and are independent normal random variables, with means equal to zero and each having equal variance. Think of this as the point where your free throw winds up, in the rim’s plane. If is in the circle, your shot goes in. Finally, suppose that the variance is chosen such that the probability that is in is exactly percent (roughly the NBA free-throw average).
But suppose you switch it up, and go granny-style, which in this universe eliminates any possible left-right error in your free throws. What’s the probability you make your shot now? (Put another way, calculate the probability that .)
The Riddler, FiveThirtyEight(original post)
Solution
First pin down the spread. With and independent and normal with mean and common variance , the distance from the centre of the rim has the Rayleigh distribution, whose probability of landing within radius is Setting this equal to the stated make rate gives , hence and
Going granny-style removes the horizontal error, so the shot now drops in exactly when , with normal of mean and variance . Standardising, means , and . Since , the argument is , so the make probability becomes Eliminating side-to-side miss lifts the free-throw rate from to about , a striking gain for a model in which only one direction of error is removed.
The computation
Re-run the experiment. Fix , scatter many shots as independent normals, and confirm two things at once: that the calibration is right (about of points fall inside the unit circle) and that the granny-style rule holds about of the time.
import numpy as np
from math import log, sqrt, erf
sigma = sqrt(1 / (4 * log(2))) # calibrated so P(in circle) = 0.75
rng = np.random.default_rng(0); n = 5_000_000
X = rng.normal(0, sigma, n)
Y = rng.normal(0, sigma, n)
print(np.mean(X**2 + Y**2 < 1)) # ~0.750 (calibration check)
print(np.mean(np.abs(Y) < 1)) # ~0.9041 (granny-style make rate)
print(erf(sqrt(2 * log(2)))) # 0.904109..., the exact value