Skip to content

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:

Negative odds: p = |odds| ÷ (|odds| + 100)
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.

p(home wins) = normalCDF(−home spread ÷ 13.86)

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.

team strength = 0.50 × preseason win rate + 0.50 × current win rate
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.

T = 1 + 2.5c
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.

How a 70 percent favorite changes across simulation styles
StyleChaos70% favorite becomes
Market-weighted0%70.0%
Balanced20%63.8%
Upset-friendly50%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.