Guide

Monte Carlo simulation in Excel

Monte Carlo simulation is a way to see the range of possible outcomes of a model whose inputs are uncertain: each uncertain input becomes a probability distribution, the model is recalculated thousands of times with values drawn from those distributions, and the collected results show how likely each outcome is.

This guide explains how it works, how to run it in Excel, how many iterations you need, how to read the results, and how to build a tornado chart. The examples and charts come from real simulations with VionRisk 0.7.0.

What is Monte Carlo simulation?

Most spreadsheet models take one number for each input - the best guess - and return one number for the result. Real inputs are rarely that certain: a contractor's price could come in anywhere between two figures, a sales volume depends on the market, a task can run late. Monte Carlo simulation replaces each uncertain input with a probability distribution that describes the values it can take and how likely each one is.

The model is then recalculated many times - each recalculation is an iteration - with a fresh set of input values drawn from those distributions. After thousands of iterations you have thousands of possible results. Sorted and counted, they answer the questions a single estimate cannot: what is the chance of a loss, what budget is enough in 80% of cases, which input matters most.

The name comes from the casino in Monaco: the method uses random numbers, as a roulette wheel does, but in a controlled and repeatable way.

Why a single estimate is not enough

Adding up best guesses does not give the best guess of the total. Costs and durations are usually skewed - they can overrun far more than they can underrun - and risk events either happen or they do not. In the project cost model below, the sum of the most likely values is $4.83m, but the average simulated cost is $5.17m, $338k higher, and the single-point estimate is enough in only 15% of iterations.

How it works, step by step

  1. Build the model as usual. A spreadsheet that turns inputs into a result: costs into a total, cash flows into an NPV, durations into a finish date.
  2. Describe each uncertain input with a distribution. A three-point estimate (minimum, most likely, maximum) becomes a PERT or triangular distribution; a yes/no risk event becomes a Bernoulli; a fitted data series becomes the distribution that fits it best.
  3. Mark the outputs - the cells whose range you want to see.
  4. Run the iterations. For each one, draw a value for every input, let Excel recalculate, and record the outputs.
  5. Summarise. A histogram shows the shape of the results, a cumulative curve the probability of meeting any target, percentiles the key values and a tornado chart the inputs that drive the result.

A worked example in Excel

A capital project has four cost lines with three-point estimates and two risk events. In VionRisk (and in @RISK) each uncertain cell holds a distribution function; the total is an ordinary Excel formula wrapped with VROutput:

CellItemFormula
B1Design ($k)=VRPert(420,480,610)
B2Civil works ($k)=VRPert(1850,2100,2900)
B3Equipment ($k)=VRTriang(1200,1300,1650)
B4Labour ($k)=VRLognorm(950,140)
B5Ground risk occurs=VRBernoulli(0.3)
B6Ground risk cost ($k)=VRPert(150,300,700)
B7Permit delay occurs=VRBernoulli(0.2)
B8Permit delay cost ($k)=VRTriang(80,200,450)
B9Total cost ($k)=VROutput("Total cost")+SUM(B1:B4)+B5*B6+B7*B8

Simulating it gives the distribution of total cost. Eight iterations in ten fall between the P10 of $4.77m and the P90 of $5.60m, and the median is $5.15m:

Total cost lands between $4.77m and $5.60m in 8 of 10 iterationsProject cost model - dark blue bars: the P10 to P90 range; orange: P90
Histogram of total project cost10,000 simulated totals. P10 $4.77m, P50 $5.15m, P90 $5.60m; the single-point estimate $4.83m sits in the low tail.0%2%4%6%$4.5m$5.0m$5.5m$6.0mTotal cost ($ millions)Share of iterations$4.43m to $4.48m: 0.5% of iterations$4.48m to $4.53m: 0.5% of iterations$4.53m to $4.58m: 0.8% of iterations$4.58m to $4.63m: 1.2% of iterations$4.63m to $4.68m: 1.9% of iterations$4.68m to $4.73m: 2.4% of iterations$4.73m to $4.77m: 3.1% of iterations$4.77m to $4.82m: 3.6% of iterations$4.82m to $4.87m: 4.4% of iterations$4.87m to $4.92m: 4.9% of iterations$4.92m to $4.97m: 4.9% of iterations$4.97m to $5.02m: 5.8% of iterations$5.02m to $5.07m: 5.7% of iterations$5.07m to $5.12m: 6.2% of iterations$5.12m to $5.17m: 6.0% of iterations$5.17m to $5.21m: 6.0% of iterations$5.21m to $5.26m: 6.0% of iterations$5.26m to $5.31m: 5.5% of iterations$5.31m to $5.36m: 4.5% of iterations$5.36m to $5.41m: 4.5% of iterations$5.41m to $5.46m: 4.0% of iterations$5.46m to $5.51m: 2.8% of iterations$5.51m to $5.56m: 2.9% of iterations$5.56m to $5.61m: 2.4% of iterations$5.61m to $5.65m: 2.0% of iterations$5.65m to $5.70m: 1.6% of iterations$5.70m to $5.75m: 1.5% of iterations$5.75m to $5.80m: 1.1% of iterations$5.80m to $5.85m: 0.9% of iterations$5.85m to $5.90m: 0.8% of iterations$5.90m to $5.95m: 0.4% of iterations$5.95m to $6.00m: 0.5% of iterations$6.00m to $6.05m: 0.3% of iterations$6.05m to $6.09m: 0.2% of iterations$6.09m to $6.14m: 0.1% of iterations$6.14m to $6.19m: 0.3% of iterationsP10 $4.77mP50 $5.15mP90 $5.60m

VionRisk 0.7.0 - 10,000 iterations, Latin Hypercube, seed 2026 · SVG

The full use case, with the S-curve for the contingency and the tornado chart of drivers, is on the use cases page.

Latin Hypercube vs Monte Carlo sampling

Plain Monte Carlo sampling draws every value independently at random. By chance, a run can over-sample one part of an input's range and miss another, and that noise shows up in the results.

Latin Hypercube sampling (LHS) splits each input's probability range into as many equal slices as there are iterations and draws exactly one value from each slice, in random order. Every part of every distribution is represented, so the results settle with fewer iterations. Both methods give the same answer on average; LHS has less noise around it. It is the default in VionRisk, as in @RISK.

The chart shows how far the estimated mean of the project cost moves from run to run, measured over 60 runs with different seeds at each number of iterations:

Latin Hypercube gets the mean about 5 times closer at 1,000 iterationsHow far the estimated mean total cost moves between runs (60 runs per point, project cost model)
Error of the estimated mean cost by number of iterations, Monte Carlo vs Latin HypercubeStandard deviation of the estimated mean total cost over repeated runs: Monte Carlo 100: 34.0, 300: 18.7, 1,000: 8.6, 3,000: 6.7, 10,000: 3.0; Latin Hypercube 100: 6.3, 300: 3.1, 1,000: 1.8, 3,000: 1.1, 10,000: 0.5 ($ thousands).$0k$10k$20k$30k1003001,0003,00010,000Iterations (log scale)Error of the mean (1 standard deviation)Monte Carlo, 100 iterations: $34.0kMonte Carlo, 300 iterations: $18.7kMonte Carlo, 1,000 iterations: $8.6kMonte Carlo, 3,000 iterations: $6.7kMonte Carlo, 10,000 iterations: $3.0kMonte CarloLatin Hypercube, 100 iterations: $6.3kLatin Hypercube, 300 iterations: $3.1kLatin Hypercube, 1,000 iterations: $1.8kLatin Hypercube, 3,000 iterations: $1.1kLatin Hypercube, 10,000 iterations: $0.5kLatin HypercubeMonte CarloLatin Hypercube

VionRisk 0.7.0 - project cost model, 60 seeds per point, Monte Carlo and Latin Hypercube · SVG

At 1,000 iterations the mean from Monte Carlo sampling moves by about $8.6k (one standard deviation) between runs; with Latin Hypercube it moves by $1.8k. Latin Hypercube at 300 iterations ($3.1k) is about as steady as Monte Carlo at 10,000 ($3.0k). The gain is largest for the mean and for models where the inputs add up; it is smaller for extreme percentiles.

How many iterations?

Enough that the number you report stops moving. Three rules of thumb:

  • The error of a mean shrinks with the square root of the iterations. For plain Monte Carlo the standard error is the standard deviation divided by √n: four times the iterations halves the error. For the cost model, a standard deviation of $320k over 10,000 iterations gives $3.2k.
  • Percentiles need more than means, tails need more than percentiles. A P90 rests on the 10% of iterations above it; a 1-in-200 event on 0.5%. 5,000 to 10,000 iterations are common for P90 budgets; rare events need more, or a model of the tail itself.
  • Fix the seed when you compare. With the same seed, two runs of the same model give identical results, and the difference between two versions of a model comes from the change, not from sampling noise. VionRisk records the seed with every result.

Reading the results

  • Histogram - the shape: where results cluster, how long the tails are, whether there are two humps (often a risk event that either happens or not).
  • Cumulative curve (S-curve) - the probability that the result is at or below any value. Read across from 80% to find the P80 budget; read up from a target to find its chance.
  • Percentiles - P10, P50 (the median) and P90 are the common summary; P80 is a usual confidence level for budgets and contingencies.
  • Mean vs median - for skewed results the mean sits above the median; the mean is what you pay on average across many projects, the median what a single project most often comes close to.
  • Tornado chart - the inputs ranked by how strongly they move the output. It tells you where better information or a mitigation pays off.
  • Correlation - if inputs move together in reality (price and volume, labour and materials), say so in the model; leaving correlation out can understate or overstate the risk. See the NPV example.

How to make a tornado chart in Excel

A tornado chart for a simulation ranks the inputs by their rank (Spearman) correlation with the output. With VionRisk it is one click: Results > Sensitivity, or the Sensitivity report. To build one by hand in Excel:

  1. Collect the iterations. One row per iteration, one column per uncertain input and one for the output. A simulation add-in writes these for you; in plain Excel, a one-variable Data Table that recalculates a RAND-based model gives the same table.
  2. Rank every column. Next to the data, use =RANK.AVG(B2,B$2:B$10001,1), filled down and across, so ties get the average rank.
  3. Correlate the ranks. For each input, =CORREL(rank of the input, rank of the output) is its Spearman rank correlation with the output.
  4. Sort by size. Copy the names and correlations to a small table, add =ABS() of each correlation and sort by it, largest first.
  5. Insert a bar chart. Select the names and correlations and insert a clustered bar chart. Format the vertical axis with Categories in reverse order so the largest bar is on top, and fix the horizontal axis from -1 to 1.
  6. Label and read it. Add data labels, remove the legend, and title the chart with the finding. Bars to the right raise the output as the input rises; bars to the left lower it.

The result for the project cost model, from VionRisk's sensitivity analysis:

Civil works, the ground risk and labour drive the cost mostRank correlation of each input with total cost (Spearman) - the largest in orange, the next two in blue
Tornado chart of rank correlations with total costSpearman rank correlation of each input with total cost: Civil works ($k) 0.56; Ground risk occurs 0.49; Labour ($k) 0.43; Equipment ($k) 0.29; Permit delay occurs 0.28; Design ($k) 0.11; Ground risk cost ($k) 0.10; Permit delay cost ($k) 0.050.000.250.500.751.00Rank correlation with total costCivil worksCivil works ($k): 0.560.56Ground risk occursGround risk occurs: 0.490.49LabourLabour ($k): 0.430.43EquipmentEquipment ($k): 0.290.29Permit delay occursPermit delay occurs: 0.280.28DesignDesign ($k): 0.110.11Ground risk costGround risk cost ($k): 0.100.10Permit delay costPermit delay cost ($k): 0.050.05

VionRisk 0.7.0 - 10,000 iterations, Latin Hypercube, seed 2026 · SVG

Rank correlation measures association in the simulated data, not proven cause: an input can rank high because it is correlated with another one that matters. VionRisk also offers regression coefficients, contribution to variance and the change in the output's mean across each input's range (the default in @RISK's tornado).

Monte Carlo in plain Excel, without an add-in

You can run a simple simulation with Excel's own functions:

  • Draw a normal value with =NORM.INV(RAND(),mean,sd), a lognormal with =LOGNORM.INV(RAND(),mu,sigma), and a yes/no event with =IF(RAND()<p,1,0).
  • Put the iteration numbers 1 to 10,000 in a column, point a one-variable Data Table (What-If Analysis > Data Table) at the output, and Excel recalculates the model once per row.
  • Summarise with PERCENTILE.INC, AVERAGE, a histogram chart and the tornado steps above.

This works for small models and is a good way to learn. Its limits show quickly: RAND() cannot be seeded, so results change on every recalculation; there is no PERT, triangular or fitted distribution built in; correlation between inputs takes extra work; Latin Hypercube sampling is not available; large Data Tables are slow; and the results are a table of numbers, not a report. A simulation add-in handles these for you - VionRisk with the same worksheet functions as @RISK, so existing models run as they are.

Questions

What is Monte Carlo simulation?

Monte Carlo simulation is a way to see the range of possible outcomes of a model whose inputs are uncertain. Each uncertain input is described by a probability distribution; the model is recalculated thousands of times with values drawn from those distributions, and the collected results show how likely each outcome is.

Can you do Monte Carlo simulation in Excel?

Yes. In plain Excel you can draw random values with RAND() and inverse distribution functions such as NORM.INV(RAND(),mean,sd) and repeat the calculation with a Data Table. A simulation add-in such as VionRisk adds ready-made distributions, Latin Hypercube sampling, correlation, a fixed seed, and charts and reports of the results.

What is the difference between Latin Hypercube and Monte Carlo sampling?

Plain Monte Carlo draws every value independently at random. Latin Hypercube sampling splits each input's probability range into as many equal slices as there are iterations and draws exactly once from each slice, so the whole range is covered evenly. Both give the same answer on average; Latin Hypercube gets there with fewer iterations.

How many iterations does a Monte Carlo simulation need?

Enough that the statistic you report stops moving. For the mean, the error of plain Monte Carlo shrinks with the square root of the number of iterations, so four times the iterations halves it. 1,000 iterations are often enough for a mean with Latin Hypercube sampling; 5,000 to 10,000 are common for percentiles such as P90, and more for rare tail events.

What do P10, P50 and P90 mean?

They are percentiles of the simulated results: P10 is the value that 10% of iterations fall below, P50 the median and P90 the value that 90% fall below. A P80 budget is a budget that is enough in 80% of the iterations.

Run your own model

VionRisk runs existing @RISK workbooks unchanged and explains the results with AI agents. Try it on one of your models in a pilot.

Start a pilot