The Math
No simulations, no guessing. Because the Round-of-32 bracket is fixed, every probability on this site is computed exactly. Here’s the whole pipeline.
What every number means
Two different kinds of percentage show up around the site — here’s the difference.
- Reach probability — “Argentina 79.7% to reach the semifinal”
- The chance a team gets to a round, adding up every path that takes it there. On the bracket, this is the greyed italic % next to a team that hasn’t arrived yet.
- Win chance, if they meet — “France 72%” — the green % on a ✓ winner
- The chance one team beats the other in a single game, if that game happens. On the bracket it’s the green % shown on a winner you’ve picked.
- “% likely” badge — “71% likely”
- The model’s chance that the predicted result actually happens — just the favoured team’s win chance, in plain words.
- Predicted score + its % — “1–1 · 13%”
- The single most likely exact scoreline, and how likely that exact score is. These stay small — football is low-scoring, so even the best guess at the exact score rarely clears ~15%.
- Champion / final % — “34.6% to win it all”
- The chance a team wins the whole tournament, or reaches the final — across every route.
- Scenario odds · “1 in N” — “1 in 35,780”
- How likely a whole complete bracket (or your current run of picks) is — the product of every game in it.
1Team strength → Elo
Each team carries a rating from the World Football Elo system (eloratings.net). The expected result of a neutral match between i and j follows the standard Elo curve, driven only by the rating gap d = Eᵢ − Eⱼ. Values here are approximate and easy to retune.
2Elo → goals (Poisson)
We turn the rating gap into a goal supremacy and split a baseline of ~2.5 goals into two scoring rates λᵢ, λⱼ. Each side’s goals are Poisson-distributed, which gives us a full scoreline grid — the most-likely exact score, expected goals, and a draw probability. The current model: World-Football-Elo → Poisson goals (neutral venue).
3Goals → advance probability
In a knockout there are no draws. We take the regulation win/draw probabilities from the Poisson grid and resolve a draw as a 50/50 shootout:
P(i advances) = P(i wins in 90′) + ½ · P(draw)
Confidence is just how decisive that is: |P(advance) − 0.5| × 2, shown 0–100.
4The superposition: an exact DP
The 32 teams form a binary tree. We compute one table — winsub[i][L], the probability team i wins the size-2L subtree it sits in:
winsub[i][L] = winsub[i][L-1] · Σ_j winsub[j][L-1] · P(i beats j)
where j ranges over the sibling sub-bracket. Five levels give every number on the site: reach the Round of 16, the final, lift the trophy. This holds all 2,147,483,648 complete brackets at once — that’s the superposition.
5Collapse: conditioning on results
When a real match finishes, we fix that node: the winner’s winsub becomes 1, the loser’s 0, and the DP re-runs. Every downstream probability re-weights instantly. Each decided match halves the space, so after k results only 2^(31−k) realities remain. The wavefunction collapses, live.
6Where “1,024” comes from
For any team there are 1 × 2 × 4 × 8 = 64 possible routes to the final, and 16 possible opponents waiting there — 64 × 16 = 1,024 distinct final scenarios, each with its own exact probability.
7Two teams meet exactly once
A fixed bracket means any two teams share exactly one ancestor node — one round where theycan collide. The chance it happens is simply P(A reaches that round) × P(B reaches that round).
8Swappable model (Kaggle / Hugging Face)
Strength and the match model live entirely in the Python layer (engine/model.py), which emits a small JSON bundle. Replace Elo with a model trained on historical results in a Kaggle notebook, or a Hugging Face match-outcome model — the bracket math and this whole UI stay identical. The ratings are editable in engine/bracket.py; re-run build_data.py and everything updates.