This page documents the complete methodology inside RunMonteCarlo — every distribution, every sampling scheme, the scheduling engine, and every output statistic — with the formulas as implemented and the literature they come from. Same seed, same inputs, same engine version → identical results, every time. The approach is aligned to the APM PRAM Guide and AACE International RP 57R-09.
Duration uncertainty is captured as a three-point estimate (minimum a, most likely m, maximum b) on each activity, and each discrete risk carries its own three-point impact range. Seven distributions are available (triangular, Trigen P10–P90, Beta-PERT, uniform, normal, lognormal, discrete); the default is triangular, the workhorse of practical QSRA because its parameters are exactly the three numbers a workshop can estimate.
Sampled by the closed-form inverse CDF, so it is exact under both random and stratified (LHS) sampling. With Fc = (m−a)/(b−a) and u ~ U(0,1):
Workshop estimates are rarely absolute limits — "best case minus 10%" usually means a P10, not a floor. Trigen treats the entered min/max as the 10th and 90th percentiles and solves for the true triangular limits (a, b) such that F(min)=0.10 and F(max)=0.90 — the solver iterates the closed-form triangular CDF tails to convergence (verified to 4 decimal places) and is cached per unique triple. This reproduces Pertmaster's Trigen behaviour and widens the tails honestly instead of clipping them.
The PERT distribution is a Beta distribution rescaled to [a, b] with shape parameters derived from the mode, giving a smoother, less tail-heavy shape than triangular for the same three points (mean = (a + 4m + b)/6):
Beta variates are generated as G₁/(G₁+G₂) from two Gamma variates via the Marsaglia–Tsang squeeze method (with the Johnk-style boost for shape < 1). Because Beta has no closed-form inverse CDF, under LHS or inside a correlation group PERT variables fall back to the triangular inverse on the same three points — a documented, conservative approximation stated in every report's method statement.
Normal deviates come from the Box–Muller transform under plain Monte Carlo; under LHS and inside correlation groups the engine uses Acklam's rational approximation to the inverse normal CDF (relative error < 1.15×10⁻⁹), which maps a stratified u directly to a z-score. The three-branch discrete option reproduces the classic Pertmaster-style 25/50/25 spot-value pattern.
Refs Vose (2008) ch. 10; Marsaglia & Tsang (2000); Acklam (2003); PMI PERT literature.
All randomness derives from a single seeded mulberry32 pseudo-random generator — a 32-bit state PRNG with good statistical quality for simulation workloads and, crucially, deterministic replay. The seed is shown in the run bar, editable, and printed in the report's reproducibility block.
Reproducibility contract: identical seed + identical inputs + identical engine version → bit-identical results. Pre- and post-mitigation scenarios are run with the same seed, so mitigation deltas are a fair like-for-like comparison, not sampling noise. The engine version is printed in every report because adding a sampling stream (as the cost layer did) legitimately changes same-seed draws between versions.
Refs mulberry32 (Ettinger, public domain); L'Ecuyer & Simard (2007) on PRNG testing.
Plain Monte Carlo converges at O(1/√N). LHS stratifies each input variable's probability axis into N equal bins and samples each bin exactly once (in an independent random order per variable), which typically cuts the iterations needed for stable P-values by a factor of 3–10 on schedule networks.
Every stratified u is pushed through the variable's inverse CDF, so marginal distributions are preserved exactly for closed-form-inverse distributions (triangular, uniform, normal, lognormal, discrete). The permutations are drawn from the same seeded stream — LHS runs are as reproducible as plain runs. The engine guards memory by capping LHS at variables × iterations ≤ 2,000,000, falling back to plain sampling above it (and saying so).
Refs McKay, Beckman & Conover (1979); Iman (2008).
Ignoring correlation between activity durations systematically understates schedule risk — the central limit theorem cancels independent errors that, in reality, move together (same crew, same weather, same estimating basis). RunMonteCarlo models this with named correlation groups: pick the activities, set one correlation coefficient ρ.
This is a one-factor Gaussian copula: correlation is induced in normal space, then mapped back through each activity's own marginal distribution, so ranges are honoured exactly while joint behaviour tightens. Pairwise correlation within a group is ρ² in normal space — a group at ρ = 0.8 gives pairwise ≈ 0.64, consistent with how Pertmaster-style tools apply a single "correlation %" to a set.
Refs Iman & Conover (1982); Vose (2008) ch. 13; Hulett (2009) on the "merge bias" and correlation understating risk.
Each iteration re-computes the full critical-path method over the project network with the sampled durations — no duration-summing shortcuts, no fixed critical path. The network is topologically ordered once at load; per iteration the engine runs a forward pass honouring all four precedence types plus lag:
Durations come from P6 XER files (calendar-aware: hours converted to working days via each calendar's hours-per-day) or MS Project MSPDI XML. Because the whole network is solved every iteration, path switching is captured naturally — the phenomenon where a near-critical path overtakes the deterministic critical path under uncertainty, which duration-only tools miss and which is the core argument for simulation over PERT hand-methods.
Refs Kelley & Walker (1959); Hulett (2009) ch. 2 on merge bias and path switching.
Register risks are modelled as Bernoulli events: in each iteration, risk r fires with probability pr; when it fires, an impact is sampled from its own three-point distribution and applied to its mapped activities (negative for opportunities). Post-mitigation values define the second scenario, run with the same seed.
This rule is deterministic, stated per-risk in the register, and printed in every report's method statement — so a reviewer can always reconstruct how compound impacts were combined.
Refs AACE RP 57R-09 §risk drivers; Hulett (2009) ch. 8 on risk-driver methods vs range-only QSRA.
All headline numbers are empirical quantiles of the simulated distribution — no normality assumption anywhere. P50/P80/P90 are read from the sorted finish (and cost) arrays; the S-curve is the empirical CDF itself.
| Statistic | Definition |
|---|---|
| P-values | Pk = k-th percentile of the simulated finish dates (sorted array, linear index). The probability of achieving the deterministic date is its rank in the same array. |
| Criticality index | Share of iterations in which the activity sat on the critical path (float ≈ 0). Flags activities that become critical under risk even if the deterministic plan says otherwise. |
| Risk driver Δdays | Mean finish of iterations where risk r fired minus mean finish where it didn't — a direct, signed days-of-impact attribution for each register risk. |
| Sensitivity | Pearson correlation between each activity's sampled duration and the project finish across all iterations. |
| Cruciality | |Pearson| × criticality index — screens out activities that are variable but never critical, and activities that are critical but certain. The activities scoring high on both are where range-tightening buys the most. |
| SSI | Schedule Sensitivity Index = criticality × σ(activity) / σ(project finish) — the DCMA-favoured blend of exposure and variability. |
| JCL | Joint Confidence Level: the share of iterations finishing on or before the date and at or under the cost — read off the finish×cost scatter ("football chart"). Deliberately stricter than schedule-P80 and cost-P80 separately, which is the entire point NASA introduced it. |
| Mitigation ROI | (P80pre − P80post) days saved, total mitigation cost, and £/day — computed from same-seed scenario pairs. |
Refs Williams (1992) on criticality/cruciality; DCMA 14-point & SSI practice notes; NASA JCL policy (NPD 1000.5); Vanhoucke (2010) on sensitivity measures.
The standard error of an estimated quantile falls with √N. For a quantile q with density f at the quantile, the asymptotic standard error of the estimate is:
In practice on project networks: 5,000 iterations gives P80 stability to well under a day on typical networks and is the app default; 10,000+ for formal submissions; with LHS on, stability arrives several times earlier. Because runs are seeded, you can verify convergence directly: run the same model at N and 2N with different seeds and watch the P80 move — if it moves less than your reporting precision, you have converged. That check takes seconds and beats any rule of thumb.
Refs Serfling (1980) on quantile asymptotics; McKay et al. (1979) on LHS variance reduction.
Monte Carlo on a broken network produces confident nonsense: open ends bypass logic, hard constraints pin dates through the simulation, negative lags hide sequence assumptions. Before you run, RunMonteCarlo grades the imported schedule against DCMA-14-aligned checks — missing logic, hard constraints, negative lags, excessive SS/FF reliance, long durations, and more — and issues a verdict: READY, READY WITH CAVEATS, or NOT RECOMMENDED, with the offending items listed and an attestation line printed in the report.
The gate is advisory, never a hard block — but the attestation makes schedule quality part of the audit trail, and for deep forensic schedule review the gate pairs with our sibling product ScheduleInsight.
Refs DCMA 14-Point Schedule Assessment; GAO Schedule Assessment Guide (GAO-16-89G).
The strongest check on a simulation engine is a network whose answer is known exactly. Our reference network V1 is the canonical merge-bias case: two independent parallel paths into one finish, each a single activity with a uniform duration — Path A ~ U(80, 120) days, Path B ~ U(70, 130) days, both planned at 100. The project finish is max(A, B), so its CDF is the product of the two path CDFs and every quantile has a closed form:
Run through the actual production engine (not a test build) — seed 8812, 10,000 iterations, Latin Hypercube on, engine 1.0-beta.9:
| Statistic | Analytic | RunMonteCarlo | Difference |
|---|---|---|---|
| Deterministic finish | day 100 | day 100 | exact |
| P50 | 110.000 | 110.075 | +0.075 d |
| P80 | 119.102 | 119.090 | −0.012 d |
| P(achieve day 100) | 25.0% | 24.9% | −0.1 pt |
All differences are inside Monte Carlo sampling tolerance at N = 10,000. This same network is also the cleanest demonstration of merge bias: both paths individually have a 50% chance of hitting day 100, yet the project's chance is only 25% and its P50 is day 110 — a full 10 days later than the deterministic plan, from geometry alone, before a single risk is added. This is why simulation, not single-path PERT, is the defensible method.
Refs Hulett (2009) ch. 2 (merge bias); MacCrimmon & Ryavec (1964) on PERT's optimistic bias at merge points.
Pertmaster is discontinued and no longer sold, so a licensed side-by-side run isn't available — to us or to most practitioners. What can be reconciled rigorously is the shared ground truth: both engines implement the same published method, so every case with a closed-form answer is a common benchmark. Beyond network V1 above, the engine reproduces the analytic answer for probabilistic branching (mixture network, analytic 35.500 — simulated 35.850), task existence (analytic 23.000 — simulated 22.946) and the two-path merge probability (analytic 0.250 — simulated 0.246), all at seed 8812 / 2,000 iterations, all inside sampling tolerance and shrinking as 1/√N.
The full statement — including the Pertmaster-to-RunMonteCarlo semantics mapping and the documented cases where results can legitimately differ — is in the project's reconciliation document, and every fixture is public. If you hold a working PRA installation, run them and send the distributions to hello@runmontecarlo.com: we'll publish the comparison, including any discrepancy, unedited.
APM (2010). Project Risk Analysis and Management (PRAM) Guide, 2nd ed. Association for Project Management.
AACE International (2011). RP 57R-09: Integrated Cost and Schedule Risk Analysis Using Monte Carlo Simulation of a CPM Model.
Hulett, D. (2009). Practical Schedule Risk Analysis. Gower.
Vose, D. (2008). Risk Analysis: A Quantitative Guide, 3rd ed. Wiley.
McKay, M., Beckman, R. & Conover, W. (1979). "A Comparison of Three Methods for Selecting Values of Input Variables in the Analysis of Output from a Computer Code." Technometrics 21(2).
Iman, R. & Conover, W. (1982). "A distribution-free approach to inducing rank correlation among input variables." Communications in Statistics B11(3).
Marsaglia, G. & Tsang, W. (2000). "A Simple Method for Generating Gamma Variables." ACM TOMS 26(3).
Williams, T. (1992). "Criticality in Stochastic Networks." Journal of the Operational Research Society 43(4).
Vanhoucke, M. (2010). Measuring Time: Improving Project Performance Using Earned Value Management. Springer (sensitivity measures).
MacCrimmon, K. & Ryavec, C. (1964). "An Analytical Study of the PERT Assumptions." Operations Research 12(1).
Kelley, J. & Walker, M. (1959). "Critical-Path Planning and Scheduling." Proceedings of the Eastern Joint Computer Conference.
DCMA (2012). 14-Point Schedule Assessment; GAO (2015). Schedule Assessment Guide, GAO-16-89G.
NASA (2015). NPD 1000.5: Policy for NASA Acquisition (Joint Confidence Level requirement).
Serfling, R. (1980). Approximation Theorems of Mathematical Statistics. Wiley (quantile standard errors).
Acklam, P. (2003). "An algorithm for computing the inverse normal cumulative distribution function."
Import a P6 or MS Project file, set a seed, and reproduce every number on this page yourself. Your data never leaves your browser.
Launch the app · beta