fix: lower darts ELO_DIVISOR to 200 for realistic EV distribution

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 <noreply@anthropic.com>
This commit is contained in:
Chris Parsons 2026-04-09 04:20:36 +00:00
parent f3af6b424e
commit d5c39d3270
2 changed files with 11 additions and 8 deletions

View file

@ -40,9 +40,9 @@ describe("setWinProb", () => {
expect(setWinProb(1000, 3000)).toBeGreaterThan(0); expect(setWinProb(1000, 3000)).toBeGreaterThan(0);
}); });
it("calibration: 100-pt gap → ~56% per set (ELO_DIVISOR=400)", () => { it("calibration: 100-pt gap → ~62% per set (ELO_DIVISOR=200)", () => {
// 1 / (1 + e^(-100/400)) ≈ 0.5622 // 1 / (1 + e^(-100/200)) ≈ 0.6225
expect(setWinProb(1900, 1800)).toBeCloseTo(0.5622, 2); expect(setWinProb(1900, 1800)).toBeCloseTo(0.6225, 2);
}); });
}); });

View file

@ -59,12 +59,15 @@ const NUM_SIMULATIONS = 50000;
* Lower = sharper (Elo differences matter more). * Lower = sharper (Elo differences matter more).
* *
* Standard chess uses 400. Snooker (more random than chess) uses 700. * Standard chess uses 400. Snooker (more random than chess) uses 700.
* Darts at the elite level is relatively skill-dominated; 400 gives: * Darts at the elite level is highly skill-dominated; 200 gives:
* 100-pt gap ~56% per set * 100-pt gap ~62% per set
* 300-pt gap ~67% per set * 200-pt gap ~73% per set
* 500-pt gap ~78% per set * 300-pt gap ~83% per set
*
* With 200, a real PDC field (top players 18001970 Elo, unseeded at 1400)
* produces EV 6570 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). * Sets needed to win per round, in bracket order (R1 first, Final last).