This is a genuine discrete-event simulation, not a formula readout. Jobs arrive one at a time with inter-arrival gaps drawn from a real exponential distribution with rate λ (a Poisson arrival process). Each job is handed to the first free server out of c parallel servers; if all c are busy it waits in a FIFO queue. Every server draws its own exponential service time with rate μ per job. The engine tracks each job's real arrival time, service-start time and departure time, and only from those timestamps does it compute the empirical average wait, average queue length and server utilization — nothing is looked up from a table.
Erlang-C gives the closed-form theoretical prediction for the same M/M/c system, computed independently from λ, μ, c:
a = λ/μ (offered load)
ρ = a/c (traffic intensity per server)
P0 = [ Σ(k=0..c-1) aᵏ/k! + aᶜ/(c!·(1−ρ)) ]⁻¹
C(c,a) = (aᶜ/(c!·(1−ρ)))·P0 (Erlang-C: prob. an arrival waits)
Wq = C(c,a) / (cμ − λ)
Lq = λ·Wq
- λ (arrival rate) — average number of jobs arriving per minute; higher λ means a busier system.
- μ (service rate) — average jobs one server can finish per minute; higher μ means faster processing.
- c (servers) — number of parallel automation workers/agents handling jobs simultaneously.
- ρ = λ/(cμ) — traffic intensity. When ρ < 1 the queue reaches statistical equilibrium and the simulated averages converge to the Erlang-C prediction. When ρ ≥ 1, arrivals outpace total service capacity and the queue genuinely grows without bound — this is a real, emergent result of the simulation loop, not a scripted effect.
Real-world relevance: M/M/c is the foundational capacity-planning model for automated service systems — RPA bot pools, ticket-routing queues, call-center staffing, API gateway worker counts — anywhere jobs arrive randomly and a fixed number of parallel workers process them.