TrackRecordTier.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. namespace Domain.Entities.Members;
  2. /// <summary>
  3. /// 예측 트랙레코드 배지 등급 (D2 M4 예측 채점+트랙레코드, d2 §③).
  4. /// 채점된 표본(Hits+Misses)이 <see cref="TrackRecordTiers.MinSample"/> 미만이면 무배지(None).
  5. /// 그 이상은 적중률(HitRate %) 구간으로 브론즈/실버/골드, 최상위는 황금개미(GoldAnt).
  6. /// </summary>
  7. public enum TrackRecordTier : byte
  8. {
  9. /// <summary>무배지 — 표본 부족(&lt; 10) 또는 적중률 50% 미만</summary>
  10. None = 0,
  11. /// <summary>브론즈 — 적중률 50% 이상</summary>
  12. Bronze = 1,
  13. /// <summary>실버 — 적중률 60% 이상</summary>
  14. Silver = 2,
  15. /// <summary>골드 — 적중률 70% 이상</summary>
  16. Gold = 3,
  17. /// <summary>황금개미 — 적중률 80% 이상 + 표본 30 이상 (고신뢰 상위 배지)</summary>
  18. GoldAnt = 4
  19. }
  20. /// <summary>
  21. /// 트랙레코드 등급 임계값 (d2 §③ — 50/60/70% = 브론즈/실버/골드).
  22. /// 황금개미는 d2 가 수치를 열어둔 항목으로, 소표본 어뷰징을 막기 위해 적중률 80% + 표본 30 이상을 채택한다.
  23. /// </summary>
  24. public static class TrackRecordTiers
  25. {
  26. /// <summary>배지 부여 최소 채점 표본 (Hits+Misses). 미만이면 항상 None (d2 §③ 표본 10+ 게이트).</summary>
  27. public const int MinSample = 10;
  28. /// <summary>브론즈 임계 적중률 (%)</summary>
  29. public const decimal BronzeHitRate = 50m;
  30. /// <summary>실버 임계 적중률 (%)</summary>
  31. public const decimal SilverHitRate = 60m;
  32. /// <summary>골드 임계 적중률 (%)</summary>
  33. public const decimal GoldHitRate = 70m;
  34. /// <summary>황금개미 임계 적중률 (%)</summary>
  35. public const decimal GoldAntHitRate = 80m;
  36. /// <summary>황금개미 임계 표본 (Hits+Misses) — 소표본 고승률 어뷰징 차단</summary>
  37. public const int GoldAntMinSample = 30;
  38. /// <summary>표본(sample=Hits+Misses)과 적중률(%)로 등급 산정.</summary>
  39. public static TrackRecordTier Resolve(int sample, decimal hitRate)
  40. {
  41. if (sample < MinSample)
  42. {
  43. return TrackRecordTier.None;
  44. }
  45. if (hitRate >= GoldAntHitRate && sample >= GoldAntMinSample)
  46. {
  47. return TrackRecordTier.GoldAnt;
  48. }
  49. if (hitRate >= GoldHitRate)
  50. {
  51. return TrackRecordTier.Gold;
  52. }
  53. if (hitRate >= SilverHitRate)
  54. {
  55. return TrackRecordTier.Silver;
  56. }
  57. if (hitRate >= BronzeHitRate)
  58. {
  59. return TrackRecordTier.Bronze;
  60. }
  61. return TrackRecordTier.None;
  62. }
  63. }