Skip to content
Vamshi Jandhyala

Books · The Riddler

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 CC) that has a radius of 11, and is centered at the origin (the point (0,0)(0,0)). Let VV be a random point in the plane, with coordinates XX and YY, and where XX and YY 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 VV is in the circle, your shot goes in. Finally, suppose that the variance is chosen such that the probability that VV is in CC is exactly 7575 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 Y<1|Y| < 1.)

The Riddler, FiveThirtyEight(original post)

Solution

First pin down the spread. With XX and YY independent and normal with mean 00 and common variance σ2\sigma^2, the distance R=X2+Y2R=\sqrt{X^2+Y^2} from the centre of the rim has the Rayleigh distribution, whose probability of landing within radius 11 is Pr(R1)=1e1/(2σ2).\Pr(R \le 1) = 1 - e^{-1/(2\sigma^2)}. Setting this equal to the stated make rate 34\tfrac34 gives e1/(2σ2)=14e^{-1/(2\sigma^2)} = \tfrac14, hence 1/(2σ2)=ln4=2ln21/(2\sigma^2) = \ln 4 = 2\ln 2 and σ2=14ln20.3607.\sigma^2 = \frac{1}{4\ln 2} \approx 0.3607.

Going granny-style removes the horizontal error, so the shot now drops in exactly when Y<1|Y| < 1, with YY normal of mean 00 and variance σ2\sigma^2. Standardising, Y<1|Y|<1 means Y/σ<1/σ|Y|/\sigma < 1/\sigma, and Pr(Y<1)=erf ⁣(1/(σ2))\Pr(|Y|<1) = \operatorname{erf}\!\big(1/(\sigma\sqrt2)\big). Since 1/(2σ2)=2ln21/(2\sigma^2) = 2\ln 2, the argument is 1/(σ2)=2ln21/(\sigma\sqrt2) = \sqrt{2\ln 2}, so the make probability becomes Pr(Y<1)=erf ⁣(2ln2)0.9041.\Pr(|Y|<1) = \operatorname{erf}\!\big(\sqrt{2\ln 2}\,\big) \approx \boxed{0.9041}. Eliminating side-to-side miss lifts the free-throw rate from 75%75\% to about 90%90\%, a striking gain for a model in which only one direction of error is removed.

The computation

Re-run the experiment. Fix σ2=1/(4ln2)\sigma^2 = 1/(4\ln 2), scatter many shots as independent normals, and confirm two things at once: that the calibration is right (about 75%75\% of points fall inside the unit circle) and that the granny-style rule Y<1|Y|<1 holds about 90.4%90.4\% 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