Random arrivals, a rope maze and up to six teller windows: watch the line breathe, and compare what you see with the Erlang C formula, Little's law and the cost of separate lines.
The science
The model (M/M/c). Customers arrive at random: the gaps between them are exponential with mean 1/lambda (a Poisson stream). Each of c tellers serves one customer at a time, taking an exponential time with mean 1/mu. One shared FIFO line feeds all windows. The offered load is a = lambda / mu (in "teller-minutes per minute") and the utilisation is rho = a / c. A steady state exists only if rho < 1.
Erlang C. The probability that an arriving customer finds all c windows busy is C(c, a) = [a^c / (c! (1 - rho))] / [ sum_{k=0}^{c-1} a^k / k! + a^c / (c! (1 - rho)) ]. The page computes it with the stable Erlang B recursion B_k = a B_{k-1} / (k + a B_{k-1}), C = B_c / (1 - rho (1 - B_c)), and checks it against the direct sum. The mean wait in the line is W_q = C / (c mu - lambda), the mean time in the bank is W = W_q + 1/mu, and Little's law L = lambda W links the average number of customers to the time they spend (also L_q = lambda W_q).
Why waiting explodes. Near rho = 1 the wait grows like 1 / (1 - rho): going from 80 % to 95 % utilisation makes the line several times longer even though only a little more work arrives. The chart is drawn in units of the mean service time, so one curve describes every speed of teller.
Fixed service times. If every service takes exactly 1/mu (M/D/1), the Pollaczek-Khinchine formula gives W_q = rho / (2 mu (1 - rho)), exactly half the exponential case, because variability in the service time also makes people wait. For several windows the page uses the Allen-Cunneen approximation W_q(M/D/c) ~ W_q(M/M/c) / 2, which is only approximate (the check uses a wider tolerance).
One line or many. If each teller has its own line and customers pick one at random, each line is an independent M/M/1 queue with arrival rate lambda / c and W_q = rho / (mu (1 - rho)). The shared serpentine rope line is always at least as good because no teller idles while someone waits elsewhere; the experiment button measures both with the same staff and customers. Real people also switch lines, which this random-choice model does not.
How the picture is driven. A discrete-event simulation (random arrivals, random service end times, FIFO assignment to the lowest free window) runs on the same clock as the animation; the people you see are exactly the customers it contains, and the measured numbers on the right are averages over the run so far. Because the arrivals are random, a short run scatters around the theory: that scatter is itself the lesson.
Honest limits. Customers never give up, jump the line or walk in groups; tellers never take breaks; service times are exponential or fixed (real ones are in between); arrival rate is constant (real banks have rush hours); the animated walking speed is a visual choice that does not affect the statistics. Rates in the presets are illustrative, not data from any real branch. At the highest speed settings the people can lag behind the statistics, which are always exact.