diff --git a/app/services/simulations/__tests__/darts-simulator.test.ts b/app/services/simulations/__tests__/darts-simulator.test.ts index 1df59e7..9c4deda 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 → ~55% per set (ELO_DIVISOR=500)", () => { - // 1 / (1 + e^(-100/500)) ≈ 0.5499 - expect(setWinProb(1900, 1800)).toBeCloseTo(0.5499, 2); + 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); }); }); diff --git a/app/services/simulations/darts-simulator.ts b/app/services/simulations/darts-simulator.ts index 922e6ba..79efc8d 100644 --- a/app/services/simulations/darts-simulator.ts +++ b/app/services/simulations/darts-simulator.ts @@ -59,12 +59,12 @@ const NUM_SIMULATIONS = 50000; * Lower = sharper (Elo differences matter more). * * Standard chess uses 400. Snooker (more random than chess) uses 700. - * Darts is moderately volatile; 500 gives: - * 100-pt gap → ~55% per set - * 300-pt gap → ~63% per set - * 500-pt gap → ~73% per set + * 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 */ -const ELO_DIVISOR = 500; +const ELO_DIVISOR = 400; /** * Sets needed to win per round, in bracket order (R1 first, Final last). @@ -289,7 +289,10 @@ export class DartsSimulator implements Simulator { participantIds.push(m.participant1Id, m.participant2Id); } - const fallbackElo = 1600; + // 1400 reflects the typical strength of unseeded PDC World Championship + // qualifiers (regional/Q-School players), who are significantly weaker than + // the seeded tour players. + const fallbackElo = 1400; // Cache matchWinProb — Elo values are fixed across simulations. const matchProbCache = new Map(); @@ -457,7 +460,10 @@ export class DartsSimulator implements Simulator { ); } - const fallbackElo = 1600; + // 1400 reflects the typical strength of unseeded PDC World Championship + // qualifiers (regional/Q-School players), who are significantly weaker than + // the seeded tour players. + const fallbackElo = 1400; // Sort participants by world ranking (ascending). Fall back to Elo order (descending) for // any without a ranking, then alphabetical as a final tiebreak.