RideWave's scooter business from the midterm and final, simulated in your browser. Six short stations, each one key idea of Monte Carlo simulation, with the matching Excel RAND() and @RISK steps. MBA 60310, Simulation module.
Rides per scooter uses the distribution fitted in station 6.
Both apply to every station. Negative normal draws are set to 0.
Every random input starts as a uniform number between 0 and 1. Reading that number on the vertical axis and across the distribution's cumulative curve gives the draw. This is what NORM.INV(RAND(), …) and RiskNormal do.
Why it works. A RAND() value lands in any slice of [0, 1] with probability equal to the slice's width. The CDF is steepest where the distribution has the most probability, so many RAND() values map there.
Drag the slider: values of RAND() near 0.5 give draws near the middle; values near 0 or 1 give the tails. Then draw 500 and watch the histogram take the distribution's shape.
One iteration draws every input once and computes profit, exactly like one row of your spreadsheet. A simulation repeats that row thousands of times and looks at the whole distribution of profit.
Rank correlation between each input and profit. The longest bar is the main driver.
Excel: build one row with RAND() formulas, copy it down 10,000 rows, then use AVERAGE, STDEV.S, COUNTIF(profit, "<0")/10000.
@RISK: one row only. Mark profit with RiskOutput, set Iterations to 10,000, click Start Simulation, and read RiskMean, RiskStdDev and the tornado graph.
Plugging the average of every input into the spreadsheet does not give the average profit. Each dot below is one simulated month: demand against the capacity the available scooters can serve.
The running average of profit after each iteration. Early on it jumps around; it settles as iterations accumulate. The shaded band is the 95% confidence interval for the true mean.
The square-root rule. The band's half-width is 1.96 × std dev ÷ √n. Ten times more iterations make it only about 3 times narrower; halving it takes 4 times more.
Seeds. A run is a sequence of RAND() values. Fixing the seed replays the same sequence, so “run again, same seed” lands exactly on top of the last line. In @RISK: Simulation Settings → Sampling → fixed random seed.
Mean profit for each price from $6 to $11. Same random numbers for every price compares the prices on the same set of months, like RiskSimtable with a fixed seed. Fresh random numbers give each price its own months.
Why same random numbers? With fresh numbers, a price can win just because it happened to draw good months. Using the same months for every price removes that luck from the comparison, so the curve is smooth and the ranking is much more stable. If the winner still alternates between two neighbors, those prices are practically tied.
@RISK: put =RiskSimtable({6, 6.5, …, 11}) in the price cell, set # Simulations to 11, fix the seed, and compare RiskMean(profit, k).
Instead of assuming Normal(180, 50), use data on rides per scooter. Each candidate distribution is fitted by maximum likelihood and ranked by AIC (lower is better), as in @RISK's Distribution Fitting.
AIC = 2 × (number of parameters) − 2 × log-likelihood. It rewards fitting the data and penalizes extra parameters. Only differences matter: a gap under about 2 means the fits are practically tied.
Try 20 data points and click New sample a few times: with little data the ranking flips. With 300 it settles.