Fix popularity score: drop sum-extremity, it inverted the ranking

Testing against known real-world popular combinations (1-2-3-4-5-6,
5-10-15-20-25-30) showed the sum-near-mean penalty scored them HIGHER
than spread-out combinations - the opposite of intended. Tight
sequential clusters produce both a strong pattern match AND an extreme
sum from the same underlying cause, so treating "extreme sum" as an
independent unpopularity signal double-counted in the wrong direction
for exactly the combinations it should penalize most.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-04 17:41:19 +02:00
co-authored by Claude Sonnet 5
parent 8c2089d734
commit e05f1f12ba
@@ -654,9 +654,17 @@ class UltimateAIMLHybridGenerator:
Basis: dokumentierte Spielerverhalten-Biases (Henze/Riedwyl-artige Analysen
realer Tippscheine): Geburtstagszahlen (<=31), einzelne "griffige" Zahlen,
Zahlenfolgen/arithmetische Muster (z.B. 5-10-15-20-25-30) und "zufällig
aussehende" ausgeglichene Odd/Even-Splits + mittige Summen werden von
Menschen überproportional oft gewählt - jede einzelne Kombination ist aber
exakt gleich wahrscheinlich, unabhängig von diesen Eigenschaften.
aussehende" ausgeglichene Odd/Even-Splits werden von Menschen
überproportional oft gewählt - jede einzelne Kombination ist aber exakt
gleich wahrscheinlich, unabhängig von diesen Eigenschaften.
Hinweis: eine "Summe nahe am Mittel"-Komponente wurde bewusst NICHT
aufgenommen - sie widerspricht sich mit der Muster-Erkennung, da gerade
die meistgespielten sequenziellen Kombinationen (z.B. 1-2-3-4-5-6) durch
ihre enge Zahlen-Clusterung zugleich eine extreme Summe erzeugen. Ohne
Trennung von "Summe extrem durch Streuung" vs. "Summe extrem durch engen
Cluster" hätte dieses Merkmal genau die falschesten Kombinationen
aufgewertet.
"""
n = len(numbers)
sorted_nums = sorted(numbers)
@@ -683,15 +691,11 @@ class UltimateAIMLHybridGenerator:
even_count = sum(1 for x in numbers if x % 2 == 0)
split_extremity = abs(even_count - 3) / 3 # 0.0 bei 3-3, 1.0 bei 6-0/0-6
# 5) Summe: Menschen bevorzugen Summen nahe dem statistischen Mittel (~150)
sum_extremity = min(abs(sum(numbers) - 150) / 100.0, 1.0)
score = (
above_31_ratio * 0.25
+ (1 - popular_ratio) * 0.15
+ (1 - pattern_penalty) * 0.20
above_31_ratio * 0.30
+ (1 - popular_ratio) * 0.20
+ (1 - pattern_penalty) * 0.30
+ split_extremity * 0.20
+ sum_extremity * 0.20
)
return min(max(score, 0.0), 1.0)