Field guide · Simulation Math
From betting signal to one explainable game result.
The simulator does not label the favorite and call it finished. It converts the best available signal into a fair probability, adjusts uncertainty, and resolves each game with a recorded random roll.
NFL Schedule Simulator
Independent fan-built project · 9 min read · Updated July 20, 2026
The drive
Signal
Moneyline, spread, or records
Fair p
Normalize both teams
Chaos
Set the uncertainty
Roll
Draw a seeded number
Result
Apply one winner
A simulation should be uncertain without being mysterious. Favorites need to win more often than underdogs, upsets need to remain possible, and a user should be able to inspect why any particular result happened. This is the model NFL Schedule Simulator uses today.
First, protect what is already known
Before the model evaluates a matchup, it asks whether a result already exists. A completed ESPN game keeps its real winner. A future game you picked manually keeps your choice. The simulator only touches undecided, pickable games, so a new run fills gaps rather than rewriting your scenario.
That rule matters in-season. A probability model can help complete the future, but it should never “re-simulate” a final score from Sunday or silently replace the upset you intentionally chose.
Step 1: choose the strongest available signal
Every unplayed game needs an initial home-team win probability. The model uses a fixed priority order so it does not blend incompatible sources when a better one is available.
1. Two-sided moneyline
If both teams have moneyline prices, those are the first choice. American odds are converted to implied probability:
Positive odds: p = 100 ÷ (odds + 100)
A sportsbook price includes margin, or “vig,” so the two implied probabilities usually add to more than 100%. The simulator removes that margin by dividing each side by their combined total.
Example: −150 vs. +130. The raw probabilities are 60.0% and 43.5%, totaling 103.5%. After normalization, the favorite’s fair probability is about 58.0% and the underdog’s is about 42.0%.
2. Point spread
If a complete moneyline is unavailable but a spread exists, the model maps the home spread to a win probability with a normal distribution using a 13.86-point standard deviation. A negative home spread means the home team is favored.
That gives intuitive checkpoints: a 3-point home favorite is roughly 58%, a 7-point favorite about 69%, and a 10-point favorite about 76%. The spread is not treated as a predicted final margin; it is converted into the chance of simply winning the game.
3. Record-based fallback
When neither a two-sided moneyline nor a spread is available, the model builds a fallback from each team’s preseason expected win rate and current win rate. Those two rates receive equal weight, then the home and away strengths are normalized into opposing probabilities.
p(home wins) = home strength ÷ (home strength + away strength)
At the start of a season, a team with no decisions yet uses .500 as its current rate. This fallback is intentionally simpler than the market path. It keeps every game simulatable, but the result should be read as a broad prior rather than a real-time power rating.
Step 2: turn the signal into a fair probability
Whichever source wins the priority check produces a probability for each side that sums to 100%. That is the fair probability: the model’s baseline before the user’s simulation style is applied.
The source and fair probability are saved with the game’s simulation trace. This is why a recap can distinguish a moneyline-based favorite from a spread-based or record-based result instead of showing every generated pick as equivalent.
Step 3: apply Chaos as temperature
The Chaos control does not add an arbitrary upset bonus, and it never swaps the favorite and underdog. It uses temperature scaling on the probability’s log-odds. Higher temperature compresses strong probabilities toward 50% while preserving which team had the advantage.
pchaos = sigmoid(logit(pfair) ÷ T)
where c ranges from 0.00 to 1.00
At Market-weighted, c = 0 and T = 1, so the fair probability is unchanged. Balanced uses c = 0.20 and T = 1.5. Upset-friendly uses c = 0.50 and T = 2.25.
| Style | Chaos | 70% favorite becomes |
|---|---|---|
| Market-weighted | 0% | 70.0% |
| Balanced | 20% | 63.8% |
| Upset-friendly | 50% | 59.3% |
This is a controlled way to create volatility. A 70% team stays favored at every setting, but the underdog receives a more realistic path to appearing in a single alternative season.
Step 4: draw one seeded random roll
After adjustment, the game has a final home-team probability. The seeded random-number generator draws one value from 0 up to 1. If the roll is below the home probability, the home team wins; otherwise the away team wins.
Example: the adjusted home probability is 0.638 and the roll is 0.421. Because 0.421 is below 0.638, the home team wins. A roll of 0.800 would send the same matchup to the away team.
A seed makes the sequence reproducible within that simulation run and gives each result an audit trail. It does not make the outcome predetermined across every visit: a fresh season simulation starts a fresh run and can produce a different coherent scenario.
Step 5: apply the result and keep moving
The winner is stored as an auto-generated pick, labeled separately from your manual choices, and fed into the same standings engine as a real or user-selected result. The model continues game by game until it fills the requested week, the remaining regular season, or the playoff bracket.
Generated scores are presentation details built around the matchup signal. They do not decide the winner and never replace a real final score or a user-entered score. Standings, tiebreakers, seeds, and bracket matchups all recompute from the resulting win-loss outcomes.
One scenario is not the same as playoff odds
Simulate Season produces one possible future: a single connected set of game outcomes you can inspect and edit. The playoff-odds calculation answers a different question. It runs the remaining season hundreds of times and counts how often each team reaches the 14-team playoff field.
In both cases, finals and manual picks stay locked. The difference is the output: one run gives you a story; repeated runs estimate a frequency. A team can miss the playoffs in the scenario on your screen while still having strong playoff odds across the larger sample.
What the model does not know
This is a transparent scenario generator, not a claim of perfect forecasting. Its current probabilities do not independently model every injury, roster move, weather condition, coaching change, matchup tendency, or late line movement. Record-based fallbacks are especially broad early in a season, when the sample of actual games is small.
- Probabilities describe uncertainty; they do not promise a result.
- A simulated upset is not automatically an error—it is an allowed part of the distribution.
- The model resolves games as wins and losses; it does not generate future ties.
- Changing Chaos changes variance, not football knowledge.
The best use is comparison: keep your important picks fixed, run more than one surrounding league scenario, and see which playoff conclusions survive the uncertainty.
How to audit a result yourself
After a simulation, open its recap or details and read the trace in order: source, fair probability, Chaos-adjusted probability, random roll, and winner. If the result looks surprising, compare the roll with the displayed probability. You should be able to explain the outcome without trusting a hidden ranking.
Put the model on the field
Run one season, then inspect it
Use Simulate Season for a complete scenario or Focus Mode to keep your team’s games under manual control.