Blog
Excel Techniques13 min8 July 2026Alex TapioBy Alex Tapio

Monte Carlo Simulation in Excel: A Step-by-Step Guide

Monte Carlo Simulation in Excel: A Step-by-Step Guide

Key Takeaways

  • Monte Carlo turns one number into a distribution. Instead of a single profit estimate, you get a mean, a spread, percentiles, and the probability of specific outcomes such as a loss.
  • You do not need an add-in. Native Excel - RAND(), NORM.INV, a one-variable Data Table, and summary functions like PERCENTILE.INC and COUNTIF - is enough to build a complete Monte Carlo simulation in Excel.
  • Choose distributions deliberately. Normal for symmetric inputs, Uniform when you only know the bounds, Triangular for min/most-likely/max estimates, Lognormal for non-negative skewed quantities.
  • The mean confirms; the tails inform. For independent inputs the simulated mean lands on your base case. The value Monte Carlo adds is everything around the mean - the P10, the P90, and the probability of loss.
  • 10,000 trials is the practical sweet spot. Precision improves with the square root of the trial count, so quadruple the trials to halve the error. Freeze the results with Paste Values before reporting.
  • Watch for correlation and wrong distributions. The two mistakes that most distort real Monte Carlo models are treating correlated inputs as independent and defaulting to Normal for everything.

Monte Carlo simulation is the honest way to model an uncertain future: it stops you pretending you know the one number, and forces you to reckon with the range. Pair it with structured scenario planning for a complete picture of upside, base, and downside - one gives you the hand-picked cases, the other the full probability weather map.

A Monte Carlo simulation in Excel replaces a single-point forecast with thousands of randomized trials, turning uncertain inputs into a full probability distribution of outcomes. Instead of asking "what is the profit?" you ask "what is the range of profit, and how likely is a loss?" This guide shows you how to build a Monte Carlo simulation in Excel from scratch - using only native functions like RAND and NORM.INV plus a Data Table - with a fully worked example, the exact formulas, and the summary statistics that make the results decision-ready.

Every forecast is wrong. The question is by how much, and in which direction. A traditional model gives you one number - a base-case NPV, a projected profit, a target valuation - built on point estimates for every input. But your inputs are not certain: units sold, unit cost, growth rate, and discount rate are all ranges, not fixed values. A Monte Carlo simulation embraces that uncertainty directly. It assigns a probability distribution to each risky input, draws a random value from each one, recalculates the model, and repeats the process thousands of times. The result is not a single answer but a distribution: a mean, a spread, percentiles, and - most usefully - the probability of an outcome you care about, such as a loss.

The best part: you do not need a paid add-in like @RISK or Crystal Ball to do this. Native Excel has everything you need. This tutorial builds a complete Monte Carlo simulation in Excel step by step.

flowchart TD A["Define the output you care about such as Profit or NPV"] --> B["Assign a probability distribution to each uncertain input"] B --> C["Draw one random value for every input"] C --> D["Calculate the output for this single trial"] D --> E["Repeat one thousand to ten thousand times"] E --> F["Collect the output from every trial"] F --> G["Summarise mean percentiles and probability of loss"] G --> H["Chart the distribution as a histogram"]

The Monte Carlo loop: from uncertain inputs to a full distribution of outcomes.


What a Monte Carlo Simulation Actually Does

The name comes from the casino district in Monaco - the method relies on repeated random sampling, the same way a gambler faces repeated random draws. In a financial model, the idea is simple:

  1. Pick the output you want to understand (profit, NPV, IRR, ending cash).
  2. For each uncertain input, choose a probability distribution that describes the range of plausible values (normal, uniform, triangular, and so on).
  3. Run one trial: draw a random value from each input's distribution and calculate the resulting output.
  4. Run thousands of trials, each with a fresh set of random draws.
  5. Analyse the collection of outputs as a distribution - its average, its spread, and the probability of specific outcomes.

Where a single-point model tells you the profit will be $50,000, a Monte Carlo simulation tells you the expected profit is around $50,000, but the realistic range spans from a $23,000 loss to a $123,000 gain, and there is roughly a one-in-five chance the project loses money altogether. That is a far more honest - and more useful - answer.

This is also what separates Monte Carlo from its simpler cousins. Sensitivity analysis flexes one input at a time; scenario analysis tests a handful of hand-picked combinations (base, bull, bear). Monte Carlo tests thousands of combinations simultaneously and weights them by how likely each is. If you are new to the simpler techniques, read our guide to sensitivity analysis in Excel first - Monte Carlo is the natural next step up.


The Building Blocks: Excel's Random Functions

Everything starts with RAND(), which returns a uniformly distributed random number between 0 (inclusive) and 1 (exclusive). On its own it is not very useful, but combined with inverse-distribution functions it can generate a draw from almost any distribution.

The key trick is inverse transform sampling: feed a uniform random number from RAND() into the inverse cumulative distribution function of the distribution you want. Excel has these built in.

Normal distribution

The workhorse. Use it for inputs that cluster symmetrically around a mean - revenue, costs, growth rates.

// Random draw from a Normal distribution with a given mean and standard deviation
= NORM.INV(RAND(), mean, standard_deviation)

// Example: units sold, mean 10,000, standard deviation 2,000
= NORM.INV(RAND(), 10000, 2000)

Uniform distribution

Every value in a range is equally likely. Good when you only know the bounds, not the shape.

// Continuous uniform between a lower bound a and upper bound b
= a + RAND() * (b - a)

// Example: discount rate equally likely to be anywhere from 8% to 12%
= 0.08 + RAND() * (0.12 - 0.08)

For a whole-number uniform draw (e.g., a random integer between 1 and 6), use =RANDBETWEEN(1, 6).

Triangular distribution

The favourite of practitioners who think in "min / most-likely / max" terms - it needs only three estimates and no statistics background. Its mean is simply (min + mode + max) / 3. The formula is longer because it stitches two curves together at the mode:

// First, put ONE random draw in a helper cell, say U1:
U1: = RAND()

// Then reference that single U1 in the triangular formula
// a = min, c = mode, b = max
= IF( U1 < (c - a) / (b - a),
      a + SQRT( U1 * (b - a) * (c - a) ),
      b - SQRT( (1 - U1) * (b - a) * (b - c) ) )

Critical detail: notice the formula reuses the same helper cell U1 in both branches. A common beginner error is to call RAND() multiple times inside one formula - each call returns a different number, which corrupts the sampling. Always draw the random number once, store it, then reference it.

Lognormal distribution

For quantities that cannot go negative and are right-skewed (asset prices, project durations):

= LOGNORM.INV(RAND(), mean_of_ln, sd_of_ln)

Worked Example: Will This Product Launch Make Money?

Let us build a real simulation. A company is evaluating a one-year product launch. The profit equation is straightforward:

Profit = Units Sold x (Price - Unit Cost) - Fixed Costs

Two of these inputs are uncertain. Here are the assumptions:

Input Type Estimate
Units Sold Uncertain (Normal) mean 10,000, std dev 2,000
Price Fixed $50
Unit Cost Uncertain (Normal) mean $30, std dev $4
Fixed Costs Fixed $150,000

The single-point answer (and why it misleads)

If you plug in the mean of every input, you get the deterministic base case:

Profit = 10,000 x ($50 - $30) - $150,000
       = 10,000 x $20 - $150,000
       = $200,000 - $150,000
       = $50,000

A $50,000 profit looks comfortable. But that number hides all the risk. What happens in a bad year where volume disappoints and costs run high at the same time? The single-point model cannot tell you. Monte Carlo can.

Setting up one trial in Excel

Lay out the model so each uncertain input is a formula, and the output references them:

// Cell B2 - Units Sold (random each recalculation)
= NORM.INV(RAND(), 10000, 2000)

// Cell B3 - Unit Cost (random each recalculation)
= NORM.INV(RAND(), 30, 4)

// Cell B4 - Profit for this trial
= B2 * (50 - B3) - 150000

Every time Excel recalculates (press F9), cells B2 and B3 draw fresh random values and B4 shows the profit for that single trial. Here are three trials I captured by hand so you can verify the arithmetic:

Trial Units Drawn Unit Cost Drawn Contribution Margin Profit
1 8,500 $33 $17 8,500 x 17 - 150,000 = -$5,500
2 11,200 $28 $22 11,200 x 22 - 150,000 = $96,400
3 9,800 $31 $19 9,800 x 19 - 150,000 = $36,200

Notice Trial 1: a below-average volume combined with an above-average cost produces an outright loss of $5,500 - exactly the downside the single-point model concealed. One trial tells you nothing on its own. The power comes from running thousands.


Running Thousands of Trials with a Data Table

The elegant native-Excel technique for repeating a calculation many times is a one-variable Data Table. Here is the setup:

  1. In column A, list your trial numbers: 1, 2, 3, ... 10000 down cells A2:A10001.
  2. In the cell one row up and one column right of the first trial number - cell B1 - put a formula that simply references your output: =B4 (the Profit cell). This is the "output to capture."
  3. Select the whole block A1:B10001.
  4. Go to Data -> What-If Analysis -> Data Table.
  5. Leave Row input cell blank. For Column input cell, point to any empty cell that your model does not use - for example $D$1.
  6. Click OK.

Excel now recalculates the entire model once for each of the 10,000 rows, and because RAND() is volatile it produces a fresh random draw every time. Column B fills with 10,000 independent profit outcomes - your simulated distribution.

// B1 - the cell the Data Table captures for every trial
= B4

// Column input cell in the Data Table dialog: any unused cell
$D$1

Tip: if the sheet becomes slow, switch calculation to Automatic Except for Data Tables (Formulas -> Calculation Options), then press F9 to re-run the whole simulation on demand.


Reading the Results: From 10,000 Numbers to a Decision

Ten thousand raw numbers are useless until you summarise them. These are the formulas that turn the trial column (call the range Results) into an answer:

// Expected (mean) profit
= AVERAGE(Results)

// Spread of outcomes
= STDEV.S(Results)

// Downside case - 10th percentile
= PERCENTILE.INC(Results, 0.10)

// Median - 50th percentile
= PERCENTILE.INC(Results, 0.50)

// Upside case - 90th percentile
= PERCENTILE.INC(Results, 0.90)

// Probability the project loses money
= COUNTIF(Results, "<0") / COUNT(Results)

Running the simulation on our product-launch model produces results like the following (your exact figures will shift slightly on every recalculation - that is the nature of random sampling):

Statistic Value What it tells you
Mean profit ~$50,000 Matches the single-point base case - as it should
Standard deviation ~$57,000 The outcomes are very spread out relative to the mean
10th percentile (P10) ~-$23,000 A bad-but-plausible year loses ~$23k
50th percentile (P50) ~$50,000 The median outcome
90th percentile (P90) ~$123,000 A good year clears ~$123k
Probability of loss ~19% Roughly a one-in-five chance of losing money

This is the payoff. The mean confirms the base case, but the simulation reveals what the base case hid: the outcomes swing across a $146,000 band from P10 to P90, and there is a ~19% chance the launch loses money. A CFO deciding whether to green-light this launch now has a risk profile, not just a hopeful point estimate.

Why the mean equals the base case

It is not a coincidence that the simulated mean (~$50,000) lands on the deterministic base case. When your uncertain inputs are independent and enter the model without being multiplied together in a skewing way, the average of many trials converges on the result you get from plugging in the average of each input. Monte Carlo does not change your expected answer - it reveals the distribution around it.

Visualising the distribution

Group the 10,000 outcomes into bins with FREQUENCY and chart them as a column histogram. An illustrative shape looks like this:

Profit Range Approx. Trials (of 10,000) Share
Below -$50,000 400 4%
-$50,000 to $0 1,500 15%
$0 to $50,000 3,100 31%
$50,000 to $100,000 3,100 31%
$100,000 to $150,000 1,500 15%
Above $150,000 400 4%

The two loss buckets (below $0) sum to 1,900 trials - 19% - which ties out with the probability-of-loss formula above. In a real run the right tail is slightly longer than the left (a mild positive skew), because profit is bounded below by the fixed cost but has no ceiling on the upside.

Live example: Scenario Planning in Excel

Loading...

How Many Trials Do You Need?

More trials produce a more stable estimate, but with diminishing returns. The precision of the simulated mean is governed by the standard error:

Standard Error of the Mean = Standard Deviation / SQRT(Number of Trials)

For our model, with a standard deviation of about $57,000:

Trials Standard Error of the Mean Interpretation
1,000 57,000 / SQRT(1,000) = ~$1,803 Mean is accurate to roughly +/- $1,800
10,000 57,000 / SQRT(10,000) = ~$570 Mean is accurate to roughly +/- $570
100,000 57,000 / SQRT(100,000) = ~$180 Mean is accurate to roughly +/- $180

Notice the pattern: to cut the error in half you must quadruple the trials (because of the square root). For most business decisions, 10,000 trials is the sweet spot - precise enough to trust the percentiles, fast enough to recalculate in a second or two. Use 1,000 for a quick look and reserve 100,000 for cases where you need tight tail estimates.


Freezing Your Results

Because RAND() is volatile, every edit, save, or F9 keypress re-randomises the entire simulation - your numbers move every time. When you are ready to report a specific run:

  1. Select the results column.
  2. Copy it.
  3. Paste as Values (Paste Special -> Values) over itself.

The numbers are now frozen static values, safe to chart and share. Keep the live formula version on a separate tab if you want to re-run later. This "snapshot then report" workflow is the single most common thing beginners forget, and it is why two people looking at the same file sometimes see different numbers.


Common Mistakes to Avoid

  1. Calling RAND() multiple times in one formula. Each RAND() is an independent draw. If your triangular or custom-distribution formula references RAND() twice, the two branches use different random numbers and the sampling is wrong. Draw once into a helper cell, then reference it.
  2. Ignoring correlation between inputs. Real inputs are often linked - high sales volume may coincide with higher unit costs (capacity strain) or lower ones (economies of scale). Treating everything as independent when it is not can badly understate or overstate risk. For correlated inputs you need a correlation technique (Cholesky decomposition) rather than naive independent draws.
  3. Using the wrong distribution. Defaulting to Normal for everything is convenient but wrong when a quantity cannot go negative (use Lognormal) or when you only have min/most-likely/max estimates (use Triangular). A Normal distribution for "units sold" can technically produce negative units - cap it with MAX(0, ...) if that matters.
  4. Too few trials. Reading percentiles off a 100-trial run gives noisy, unreliable tail estimates. Use at least 1,000; prefer 10,000.
  5. Reporting a live (unfrozen) run. Screenshotting results while RAND() is still volatile means the numbers changed the instant you pressed a key. Freeze with Paste Values before reporting.
  6. Confusing the mean with the outcome. The expected value is not what will actually happen - it is the long-run average of many parallel universes. The whole point of Monte Carlo is the spread and the probability of bad outcomes, not the single mean number.
  7. Forgetting to sanity-check. If your simulated mean does not roughly match your deterministic base case (for independent inputs), something is wired wrong. Always reconcile the two before trusting the distribution.

Alex Tapio, founder of Finamodel and ex-Deloitte financial modelling expert

Alex Tapio

Founder of Finamodel • Professional Financial Modeller • Ex-Deloitte

alextapio.comx.com/alextapioLinkedIncontact [at] finamodel.com

Frequently asked

A Monte Carlo simulation is a modelling technique that quantifies uncertainty by running a calculation thousands of times, each time drawing random values for the uncertain inputs from probability distributions you specify. Instead of a single-point answer, it produces a full distribution of outcomes so you can see the expected value, the range, and the probability of specific results such as a loss. The name refers to the Monaco casino district, because the method relies on repeated random sampling.

Yes. Native Excel has everything required. Use RAND() combined with inverse functions like NORM.INV to draw random inputs, a one-variable Data Table (Data -> What-If Analysis -> Data Table) to repeat the calculation thousands of times, and functions such as AVERAGE, STDEV.S, PERCENTILE.INC and COUNTIF to summarise the results. Paid add-ins like @RISK or Crystal Ball add convenience, correlation tools, and nicer charts, but they are not necessary for a working simulation.

The precision of the estimate improves with the square root of the number of trials, so returns diminish as you add more. Use at least 1,000 trials for a quick look, 10,000 for a reliable estimate suitable for most business decisions, and 100,000 or more only when you need very tight estimates of extreme tail outcomes. Because error scales with the square root, cutting the error in half requires quadrupling the number of trials.

The core set is: RAND() for a uniform random number between 0 and 1; NORM.INV(RAND(), mean, sd) for a normal draw; RANDBETWEEN for random integers; LOGNORM.INV for lognormal draws; a Data Table to run many trials; and AVERAGE, STDEV.S, PERCENTILE.INC, FREQUENCY and COUNTIF to summarise and chart the output distribution.

Sensitivity analysis flexes one input at a time to see which drivers matter most. Scenario analysis tests a small number of hand-picked combinations, such as base, bull, and bear cases. Monte Carlo goes further by testing thousands of random combinations of all uncertain inputs simultaneously and weighting each by how likely it is, producing a full probability distribution rather than a handful of discrete cases. The three are complementary: sensitivity finds the key drivers, scenario frames the narrative cases, and Monte Carlo quantifies the overall probability of outcomes.

Because RAND() is a volatile function: it draws a brand-new random number on every edit, save, or F9 keypress, which re-runs the entire simulation with fresh draws. This is expected behaviour. When you want to lock in a specific run to chart or report, copy the results column and Paste Special as Values, which converts the live formulas into static numbers that no longer change.

Have more financial modelling questions? Contact us

Go further

Build the financial model you need with Fina

Browse templates, examples, and downloadable Excel models for the analysis you are trying to build. If you can't find your model, ask Fina to build a model for your specific needs.

Start for free
Excel financial model spreadsheet preview showing Customer Rollforward
Fina interactive chat interface preview