Skip to main content

Overview

Any numeric field that varies run-to-run can be drawn from a probability distribution instead of a fixed number. Distributions let a model reflect real-world variability: cycle times that vary, demand that clusters and lulls, processing durations with realistic long tails. The distribution-capable slots in a model are:
  • Processing time on a Process
  • Resource requirements on a Process (per-resource quantities)
  • Arrival logic on a Source — note this is an inter-arrival time (time between arrivals), not a rate
  • Changeover times on a Resource
  • The Random assignment strategy for entity attributes on Source, Combiner, Separator, and Transformer outputs
A Buffer’s release_entity quantity takes a literal number or a DSL expression, but not a distribution — there’s no distribution picker on that field, so don’t go looking for one.
Open the distribution picker on any numeric field and choose from eleven options: Fixed, Normal, Exponential, Uniform, Lognormal, Lognormal (mean/CV), Weibull, Triangular, Erlang, Beta, Gamma. Each choice reveals its own set of parameter fields below the picker. Every parameter field renders as a DDD:HH:MM:SS time picker by default. Click the </> toggle next to any parameter to flip that field into expression mode and type a DSL expression instead: that’s how you make variability depend on simulation state, constants, or entity attributes. The distribution choice and its parameter shape are static configuration. Individual parameter values can be literals or expressions, mixed freely — with one exception: Lognormal (mean/CV) takes plain numbers only, since it does a closed-form conversion to log-space parameters when you configure it.
Every parameter field uses the DDD:HH:MM:SS time picker by default, even for dimensionless parameters like Beta’s shape parameters, Weibull’s shape, or Lognormal’s σ. The widget is the same regardless of unit; in non-time contexts treat the value as a plain number. The </> toggle still gives you a free-form expression input when you need it.

Supported Distributions

Fixed

A deterministic value. Technically not a distribution, but included for consistency so every numeric field uses the same picker. Parameters
  • Value: the constant the field always resolves to. Defaults to 0.0.
Default Fixed value is 0.0. A freshly-added Fixed parameter resolves to zero until you set it: a silent zero-duration processing step or zero-rate arrival is a common modeling trap. Always set the value before you run.
Use for: predictable, non-random values. Useful when you want the field to be wired the same way as variable fields but the value should not vary.
Fixed + expression mode is how you feed a computed value into a distribution slot. There’s no way to call a distribution from the DSL, but the reverse composition is the documented pattern: pick Fixed, flip its Value into expression mode, and write LOOKUP(CYCLE_TIMES, product_type, default:=60) or any other expression.

Normal

The classic bell curve: symmetric around a mean, spread controlled by standard deviation. Parameters
  • Mean: center of the distribution.
  • Standard Deviation: spread around the mean.
Use for: processing times that cluster tightly around a central value with symmetric variability. Machine cycle times, measurement errors, and anything subject to many small independent sources of variation. Watch out: normal distributions extend to negative infinity, so a Normal can sample a negative duration. Don’t use it for processing or arrival times — for strictly positive quantities (times, weights), prefer Lognormal or Gamma.

Exponential

Time between memoryless events. Higher concentration near zero, long tail. Parameters
  • Beta: the mean (equivalently, 1 over the rate). Despite the name, it’s the expected value of a sample.
Use for: inter-arrival times in Poisson processes (random arrivals), time until a random failure, time until a random event with constant hazard rate.

Uniform

Every value between the bounds is equally likely. Flat distribution. Parameters
  • Lower Bound: minimum sample value.
  • Upper Bound: maximum sample value. Must be strictly greater than the Lower Bound.
Use for: cases where you only know the bounds and have no reason to favor any specific value within them. Often a starting assumption before better data is available.

Lognormal

A log-transform of a normal distribution: right-skewed, strictly positive, with a long right tail. Parameters
  • Mu: mean of the underlying normal distribution (before the log transform), not of the lognormal itself.
  • Sigma: standard deviation of the underlying normal distribution.
Mu and Sigma are log-space parameters, not the mean and standard deviation of your data. Entering a real-world mean of 60 as Mu is the #1 lognormal mistake — it produces samples around e⁶⁰. Convert first (below). Extremely large Mu (above roughly 700) overflows the exponential entirely.
Converting from a real-world mean and CV. Process-engineering numbers usually arrive as a mean duration and a coefficient of variation (CV = standard deviation ÷ mean), not as log-space parameters. If you’re starting from floor data, reach for Lognormal (mean/CV) below — it takes the mean and CV directly and does this conversion for you. The math it applies is:
For example, mean 60 with CV 0.3: sigma² = ln(1.09) ≈ 0.086 → Sigma ≈ 0.294, Mu = ln(60) − 0.043 ≈ 4.05. Use plain Lognormal only when your inputs are already the underlying normal’s Mu and Sigma. Use for: service times, task durations, and any quantity that’s positive, has a clear typical value, and occasionally has long outliers. Many real-world “how long does this take?” distributions are well-modeled by lognormal.

Lognormal (mean/CV)

The same lognormal shape as above, but parameterized the way floor data actually arrives: by the real-world mean and coefficient of variation, rather than the log-space Mu and Sigma. It performs the mean-and-CV conversion for you, so you never touch log space. Parameters
  • Mean: the real-world mean of the sampled values (not a log-space parameter).
  • CV: the coefficient of variation (standard deviation ÷ mean), in real units.
Mean and CV take plain numbers only — no expression mode. Unlike every other distribution, this one converts your inputs to log-space parameters when you configure it, so its two fields don’t accept a </> DSL expression. If you need the lognormal parameters to vary with simulation state, use plain Lognormal and put the expression on Mu or Sigma.
Use for: the common case where you have a mean duration and a spread (or CV) from the floor and want a positive, right-skewed distribution without doing the log-space conversion by hand. This is the recommended lognormal entry point whenever you’re starting from empirical numbers.

Weibull

Flexible distribution that can model increasing, constant, or decreasing hazard rates depending on its shape parameter. Parameters
  • Shape: controls how the hazard rate evolves with elapsed time. Shape < 1 models infant mortality (failure rate decreasing over time), Shape = 1 reduces to Exponential (constant rate), Shape > 1 models wear-out (failure rate increasing over time).
  • Scale: characteristic magnitude of the samples.
Both parameters must be greater than zero. Use for: time-to-failure modeling (reliability engineering), fatigue life, and any process where the rate of occurrence changes with elapsed time.

Triangular

A simple three-point distribution. Parameters
  • Lower Bound: minimum possible value.
  • Upper Bound: maximum possible value.
  • Mode: most likely value. Must satisfy Lower Bound ≤ Mode ≤ Upper Bound.
The mean of a Triangular sample is (lower + upper + mode) / 3 — handy for sanity-checking results against the numbers you were given. Use for: expert-elicited estimates (“fastest it ever takes is 2 min, typically 5 min, worst case 10 min”). A reasonable default when you have three-point estimates but no empirical distribution to fit.

Erlang

Sum of Shape independent exponential random variables, where Shape must be a positive integer. Parameters
  • Shape: number of exponential stages summed (positive integer; the field doesn’t visibly reject non-integer entry, but backend validation does).
  • Scale: mean of each underlying exponential stage.
Use for: multi-stage processes where each stage is exponentially distributed, or when you need positive distributions with more shape control than exponential and less complexity than gamma. If you want a non-integer shape, use Gamma — it’s the continuous generalization of Erlang.

Beta

Distribution on the interval [0, 1], flexibly shaped by two parameters. Parameters
  • Alpha: first shape parameter.
  • Beta Parameter: second shape parameter. (The label is spelled out to avoid confusion with the Beta distribution name itself.)
Both shape parameters must be greater than zero.
In the model JSON, the second parameter is serialized as beta_param (not beta) — worth knowing if you read or write model files directly.
Use for: proportions, yields, and probabilities that vary run-to-run. Shape parameters let you express everything from uniform (Alpha = 1, Beta Parameter = 1) through bell-like shapes to heavily skewed.

Gamma

General-purpose continuous distribution for positive quantities, controlled by two parameters. Parameters
  • Alpha: shape parameter.
  • Beta: scale parameter. (The engine uses gammavariate(alpha, beta) with beta as scale, so the mean is α·β.)
Both parameters must be greater than zero. Gamma reduces to Exponential at Alpha = 1 and to Erlang at integer Alpha. Use for: positive quantities with a more flexible shape than exponential or lognormal. Service times, waiting times, and queueing phenomena.

Choosing a Distribution

If you have real data, fit a distribution to it. If you don’t: For processing times where you have “average” and “worst case” numbers from the floor, Triangular is a pragmatic default; if you have a mean and a spread, Lognormal (mean/CV) is usually better. For arrival patterns, Exponential is the standard start. Never use Normal for durations — it samples negative values. For distribution-sensitive work (queue analysis, reliability), fit to real data.

Parameterizing with DSL Expressions

Each parameter field has a </> toggle next to its label. Click it and the time picker is replaced by a single-line text input where you type a DSL expression: references to constants, state variables, entity attributes (where the context allows), or composed expressions. Toggle back to revert to the time-picker entry mode. A parameter in expression mode might hold:
  • base_time * complexity_factor: scale a Normal distribution’s Mean by an entity-level complexity factor while leaving Standard Deviation as a literal.
  • LOOKUP(mean_interarrival_by_shift, current_shift): drive an Exponential distribution’s Beta from a shift-indexed lookup table.
  • LOOKUP(log_mean_weight_by_product, ENTITY_TYPE): pick a Lognormal Mu per product type while keeping Sigma fixed.
Expression-mode and time-picker parameters can be mixed freely on the same distribution: flip only the parameters that need to vary. This composability is what lets a single model represent rich, data-driven variability without hardcoding numbers across dozens of fields.

Tips

  • Draw from the distribution at use time, not at entity creation time. For processing times especially, sample the distribution when the Process runs, not as an entity attribute set at the Source. This keeps the sample close to the state it should depend on.
  • Normal isn’t always the answer. It’s familiar but it can produce negative samples. For strictly positive quantities, prefer Lognormal (mean/CV) or Gamma.
  • Check parameter labels carefully. Different distributions reuse names even when the mathematical concept is similar: Exponential’s Beta is a mean, Gamma’s Beta is a scale (mean = Alpha × Beta), and Beta’s Beta Parameter is a shape. The picker’s labels are the source of truth.
  • Respect parameter constraints. Uniform needs upper > lower; Triangular needs lower ≤ mode ≤ upper; Erlang’s shape must be a positive integer; Weibull, Gamma, Beta, and Exponential parameters must all be positive. Violations surface at validation, not as odd samples.
  • Match distribution to data when possible. A fitted distribution on real MES cycle times will give much more realistic results than an assumed parametric one.
  • Use Fixed to simplify initial modeling. Start with fixed values to verify the structure, then swap in distributions once the model is correct.