From d5c39d327048f517ef5cfe3b06913246b61b8d56 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Thu, 9 Apr 2026 04:20:36 +0000 Subject: [PATCH] fix: lower darts ELO_DIVISOR to 200 for realistic EV distribution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the actual PDC field (top players clustered 1800–1970 Elo, Littler at ~2080), ELO_DIVISOR=400 made the gap between world #1 and the top 8 too soft — EV for Littler came out ~37 instead of the expected 65–70. ELO_DIVISOR=200 calibrates correctly for this field: a 100-pt gap now gives ~62% per-set win probability (vs ~56% at 400), sharply rewarding the best players while still allowing upsets. Littler at 2084 produces EV ≈ 65–70 against the real PDC tour roster. Co-Authored-By: Claude Sonnet 4.6 --- .../simulations/__tests__/darts-simulator.test.ts | 6 +++--- app/services/simulations/darts-simulator.ts | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/services/simulations/__tests__/darts-simulator.test.ts b/app/services/simulations/__tests__/darts-simulator.test.ts index 9c4deda..cf85093 100644 --- a/app/services/simulations/__tests__/darts-simulator.test.ts +++ b/app/services/simulations/__tests__/darts-simulator.test.ts @@ -40,9 +40,9 @@ describe("setWinProb", () => { expect(setWinProb(1000, 3000)).toBeGreaterThan(0); }); - it("calibration: 100-pt gap → ~56% per set (ELO_DIVISOR=400)", () => { - // 1 / (1 + e^(-100/400)) ≈ 0.5622 - expect(setWinProb(1900, 1800)).toBeCloseTo(0.5622, 2); + it("calibration: 100-pt gap → ~62% per set (ELO_DIVISOR=200)", () => { + // 1 / (1 + e^(-100/200)) ≈ 0.6225 + expect(setWinProb(1900, 1800)).toBeCloseTo(0.6225, 2); }); }); diff --git a/app/services/simulations/darts-simulator.ts b/app/services/simulations/darts-simulator.ts index 79efc8d..b8759e6 100644 --- a/app/services/simulations/darts-simulator.ts +++ b/app/services/simulations/darts-simulator.ts @@ -59,12 +59,15 @@ const NUM_SIMULATIONS = 50000; * Lower = sharper (Elo differences matter more). * * Standard chess uses 400. Snooker (more random than chess) uses 700. - * Darts at the elite level is relatively skill-dominated; 400 gives: - * 100-pt gap → ~56% per set - * 300-pt gap → ~67% per set - * 500-pt gap → ~78% per set + * Darts at the elite level is highly skill-dominated; 200 gives: + * 100-pt gap → ~62% per set + * 200-pt gap → ~73% per set + * 300-pt gap → ~83% per set + * + * With 200, a real PDC field (top players 1800–1970 Elo, unseeded at 1400) + * produces EV ≈ 65–70 for the world #1 (≈2080 Elo) in a 128-player bracket. */ -const ELO_DIVISOR = 400; +const ELO_DIVISOR = 200; /** * Sets needed to win per round, in bracket order (R1 first, Final last).