Common Distributions: An Overview

A handful of probability distributions describe a huge range of natural, epidemiological, and experimental data: coin-flip-like proportions, counts of rare events, waiting times between infections, and the bell-shaped noise that emerges whenever many small effects add up. This page is a map to the five workhorse distributions and when each one arises.

The five workhorses

Comparison table

DistributionTypeSupportParametersMeanVarianceR sampler
NormalContinuousx(,)x\in(-\infty,\infty)μ, σ2\mu,\ \sigma^2μ\muσ2\sigma^2rnorm(n, mean, sd)
BinomialDiscretek{0,1,,n}k\in\{0,1,\dots,n\}n, pn,\ pnpnpnp(1p)np(1-p)rbinom(N, n, p)
PoissonDiscretek{0,1,2,}k\in\{0,1,2,\dots\}λ>0\lambda>0λ\lambdaλ\lambdarpois(n, lambda)
ExponentialContinuousx0x\ge 0rate λ>0\lambda>01/λ1/\lambda1/λ21/\lambda^2rexp(n, rate)
Student’s tContinuousx(,)x\in(-\infty,\infty)df ν>0\nu>000 (for ν>1\nu>1)νν2\frac{\nu}{\nu-2} (for ν>2\nu>2)rt(n, df)

The R d/p/q/r naming convention

R names distribution functions by a prefix + root. The root is the distribution (norm, binom, pois, exp, t), and the prefix picks the operation:

So dnorm, pnorm, qnorm, rnorm are the four faces of the normal distribution, and the same pattern holds for every distribution below.

In code

R

set.seed(42)

# One sampler per distribution (r* prefix)
rnorm(3, mean = 0, sd = 1)   # Normal
rbinom(3, size = 10, prob = 0.3)  # Binomial
rpois(3, lambda = 4)         # Poisson
rexp(3, rate = 0.5)          # Exponential
rt(3, df = 5)                # Student's t

# d/p/q faces of the normal
dnorm(0)          # density at 0  -> 0.3989
pnorm(1.96)       # cdf at 1.96   -> 0.975
qnorm(0.975)      # quantile      -> 1.96

Python

import numpy as np
from scipy import stats

rng = np.random.default_rng(42)

rng.normal(0, 1, size=3)                 # Normal
rng.binomial(n=10, p=0.3, size=3)        # Binomial
rng.poisson(lam=4, size=3)               # Poisson
rng.exponential(scale=1/0.5, size=3)     # Exponential (scale = 1/rate)
stats.t.rvs(df=5, size=3, random_state=42)  # Student's t

stats.norm.pdf(0)      # density  -> 0.3989
stats.norm.cdf(1.96)   # cdf      -> 0.975
stats.norm.ppf(0.975)  # quantile -> 1.96

Julia

using Distributions, Random
Random.seed!(42)

rand(Normal(0, 1), 3)      # Normal
rand(Binomial(10, 0.3), 3) # Binomial
rand(Poisson(4), 3)        # Poisson
rand(Exponential(2), 3)    # Exponential (scale = 1/rate = 2)
rand(TDist(5), 3)          # Student's t

pdf(Normal(0, 1), 0)       # density  -> 0.3989
cdf(Normal(0, 1), 1.96)    # cdf      -> 0.975
quantile(Normal(0, 1), 0.975)  # quantile -> 1.96

Simulation

A quick check that samples converge to their theoretical means. Averaging many Poisson(λ=4\lambda=4) draws should land near 44.

set.seed(1)
mean(rpois(1e6, lambda = 4))  # ~ 4.00 (theoretical mean = lambda = 4)
var(rpois(1e6, lambda = 4))   # ~ 4.00 (Poisson: variance = mean)

As the sample size grows the empirical mean and variance both approach λ\lambda, exactly as the law of large numbers predicts.

Why it matters for statistics

Every inferential method assumes a probability model for the data. Choosing the right distribution — counts vs. proportions vs. continuous measurements — determines which estimator, test, and confidence interval are valid. Recognizing the mechanism that generates each distribution (adding effects → normal, counting rare events → Poisson, waiting for events → exponential) lets you pick models from first principles rather than by trial and error.