Probability · Mathematical Statistics
📅 July 2026 ⏱ ≈ 14 min read 🎯 Advanced

Central Limit Theorem: Proof and Consequences

Roll a die a thousand times and sum the results — the total looks Normal, no matter how lumpy a single die roll's distribution is. We prove why, using characteristic functions, quantify how fast convergence happens with the Berry-Esseen bound (a formula giving the worst-case gap between the actual sum's distribution and the Normal curve at any finite n), and simulate it in JavaScript.

TL;DR: Sums of many independent random variables always end up looking Normal, no matter the original distribution's shape — this article proves that fact using characteristic functions, shows the Berry-Esseen formula for how fast the approximation gets accurate as sample size grows, and includes a JavaScript dice-rolling simulation that demonstrates the bell curve emerging in practice.

1. Statement of the theorem

Let X₁, X₂, …, Xₙ be independent and identically distributed (i.i.d.) random variables with finite mean μ and finite variance σ² > 0. Define the standardised sum:

Zₙ = (Σᵢ Xᵢ − nμ) / (σ√n)   =   (X̄ₙ − μ) / (σ/√n)

The Lindeberg-Lévy Central Limit Theorem states that as n → ∞, Zₙ converges in distribution to the standard Normal:

Zₙ   d   N(0, 1)

Remarkably, this holds regardless of the shape of the original distribution of Xᵢ — it could be uniform, exponential, a single fair die, or wildly skewed — as long as the variance is finite.

2. Characteristic functions

The proof relies on the characteristic function of a random variable X, defined as φX(t) = E[eitX]. Two facts make it the right tool:

This turns a hard problem about distributions into an easy problem about ordinary complex-valued function limits.

3. Proof sketch (Lindeberg-Lévy CLT)

Without loss of generality assume μ = 0 (subtract the mean) and σ² = 1 (rescale). Let Y = X/σ so E[Y]=0, E[Y²]=1. The characteristic function of Y admits a Taylor expansion near t = 0:

φY(t) = 1 + it·E[Y] − (t²/2)·E[Y²] + o(t²)
      = 1 − t²/2 + o(t²)    // since E[Y]=0, E[Y²]=1

The characteristic function of the standardised sum Zₙ = (1/√n) Σ Yᵢ is, using the product rule for independent variables and the scaling property φaX(t) = φX(at):

φZₙ(t) = [ φY(t/√n) ]ⁿ

= [ 1 − t²/(2n) + o(1/n) ]ⁿ

Now take n → ∞. This is exactly the classical limit form (1 + x/n)ⁿ → eˣ with x = −t²/2:

limn→∞ [1 − t²/(2n) + o(1/n)]ⁿ = e−t²/2

But e−t²/2 is exactly the characteristic function of the standard Normal N(0,1). By Lévy's continuity theorem, since this limit function is continuous at t = 0, Zₙ converges in distribution to N(0,1).

Why finite variance matters: the Taylor expansion of φY(t) to second order requires E[Y²] < ∞. Distributions with infinite variance (e.g. Cauchy, or heavy-tailed Pareto with α ≤ 2) do not obey this CLT — their sums instead converge to stable distributions with different scaling exponents (the generalised CLT).

4. Rate of convergence: Berry-Esseen

The CLT says convergence happens eventually — the Berry-Esseen theorem quantifies how fast, using the third absolute moment ρ = E[|Y|³]:

supx |FZₙ(x) − Φ(x)| ≤ C·ρ / √n

where Φ is the standard Normal CDF and C is an absolute constant (known to satisfy C ≤ 0.4748). The bound shrinks as 1/√n — convergence is guaranteed but slow: to halve the maximum error you need 4× more samples.

Source distributionn for "visually Normal" histogramWhy
Single fair die~10–20Symmetric, bounded, small ρ
Exponential(λ)~30–50Skewed, moderate ρ
Heavy-tailed (finite but large ρ)100s–1000sLarge third moment slows convergence

5. Consequences for statistics

6. JavaScript: dice-sum simulation

Summing a single uniform die (values 1–6, itself far from Normal) already looks strikingly bell-shaped after just a handful of dice:

// Sum of `k` fair dice, repeated `trials` times, binned into a histogram.
function rollDie() { return 1 + Math.floor(Math.random() * 6); }

function diceSumHistogram(k, trials) {
  const hist = {};
  for (let t = 0; t < trials; t++) {
    let sum = 0;
    for (let d = 0; d < k; d++) sum += rollDie();
    hist[sum] = (hist[sum] || 0) + 1;
  }
  return hist;
}

// Compare empirical mean/variance to CLT prediction: mean = k*3.5, var = k*35/12
function cltCheck(k, trials) {
  const hist = diceSumHistogram(k, trials);
  let mean = 0;
  for (const sum in hist) mean += Number(sum) * hist[sum];
  mean /= trials;
  let variance = 0;
  for (const sum in hist) variance += hist[sum] * (Number(sum) - mean) ** 2;
  variance /= trials;
  return { mean, variance, predictedMean: k * 3.5, predictedVariance: k * 35/12 };
}

console.log(cltCheck(10, 100000));
// { mean: ~35.0, variance: ~29.17, predictedMean: 35, predictedVariance: 29.166... }
Try it live: the Normal Distribution simulation on this site lets you slide the number of summed dice from 1 to 20 and watch the histogram morph from a flat uniform bar chart into a smooth bell curve — a direct visual proof of the theorem above.

📈 Watch the CLT in action

Sum dice rolls live and see the histogram converge to the Normal distribution.

Open simulation →

🔗 Related Simulations

📈Normal Distribution 🎯Monte Carlo 🎯Bayesian Inference 🃏Markov Chain