48 teams. 1,248 squad players. 1,104 active simulation pool. Poisson-calibrated xG. Seeded mulberry32 PRNG. Annex C bracket logic. This is how simulation should be built.
Explore the Simulator →Every match, goal, card, and substitution is derived from first principles. not lookup tables or random coin flips.
5,000 independent tournament runs converge on stable probability distributions: group probabilities, round-by-round qualification odds, possible opponents, matchup frequencies, and win rates across all 48 teams.
Goals follow a Poisson process. Expected goals are derived from team attack/defense ratings raised to the upset exponent, capped at 3.5 to suppress unrealistic blowouts. Calibrated to WC 2002–2022 empirical data.
A seeded 32-bit pseudo-random number generator. Not Math.random(). Same seed always produces the identical tournament. Every R() call is unconditional, guaranteeing a stable RNG path regardless of detail mode.
Unlike static-rating simulators, WC26 Sim dynamically adjusts expected goals using real-world Elo ratings. A team punching above their FIFA ranking gets a boost. Up to ±3% xG. Creating realistic momentum and upset effects.
The multiplier is applied after the power-function composition to prevent exponential amplification. Elo impact is intentionally capped to avoid overwhelming the underlying team rating model.
The interface also exposes manual team strength adjustments and score locking, so custom results can be rerun before users commit picks in the Fan Zone prediction flow.
// ── Statistical constants ───────────────── const BASE_XG = 0.012; // calibrated WC02-22 const XG_CAP = 3.5; // suppresses blowouts const ELO_MAX_IMPACT = 0.03; // max ±3% xG scalar // ── xG composition ──────────────────────── const xgA_base = Math.max(0.3, Math.min(XG_CAP, BASE_XG * Math.pow(attA / defB, UPEX) * 90 ) ); // ── Elo scalar applied post-composition ─── const xgA = xgA_base * eloMultiplier(nameA); // ── Poisson goal draw ────────────────────── let sa = pois(xgA); // Poisson(λ=xgA) let sb = pois(xgB); // Poisson(λ=xgB)
Below 1,000 sims, probability distributions are too noisy. Beyond 10,000, the marginal accuracy gain is under 0.8%. While browser render time doubles.