| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- namespace Domain.Entities.Members;
- /// <summary>
- /// 예측 트랙레코드 배지 등급 (D2 M4 예측 채점+트랙레코드, d2 §③).
- /// 채점된 표본(Hits+Misses)이 <see cref="TrackRecordTiers.MinSample"/> 미만이면 무배지(None).
- /// 그 이상은 적중률(HitRate %) 구간으로 브론즈/실버/골드, 최상위는 황금개미(GoldAnt).
- /// </summary>
- public enum TrackRecordTier : byte
- {
- /// <summary>무배지 — 표본 부족(< 10) 또는 적중률 50% 미만</summary>
- None = 0,
- /// <summary>브론즈 — 적중률 50% 이상</summary>
- Bronze = 1,
- /// <summary>실버 — 적중률 60% 이상</summary>
- Silver = 2,
- /// <summary>골드 — 적중률 70% 이상</summary>
- Gold = 3,
- /// <summary>황금개미 — 적중률 80% 이상 + 표본 30 이상 (고신뢰 상위 배지)</summary>
- GoldAnt = 4
- }
- /// <summary>
- /// 트랙레코드 등급 임계값 (d2 §③ — 50/60/70% = 브론즈/실버/골드).
- /// 황금개미는 d2 가 수치를 열어둔 항목으로, 소표본 어뷰징을 막기 위해 적중률 80% + 표본 30 이상을 채택한다.
- /// </summary>
- public static class TrackRecordTiers
- {
- /// <summary>배지 부여 최소 채점 표본 (Hits+Misses). 미만이면 항상 None (d2 §③ 표본 10+ 게이트).</summary>
- public const int MinSample = 10;
- /// <summary>브론즈 임계 적중률 (%)</summary>
- public const decimal BronzeHitRate = 50m;
- /// <summary>실버 임계 적중률 (%)</summary>
- public const decimal SilverHitRate = 60m;
- /// <summary>골드 임계 적중률 (%)</summary>
- public const decimal GoldHitRate = 70m;
- /// <summary>황금개미 임계 적중률 (%)</summary>
- public const decimal GoldAntHitRate = 80m;
- /// <summary>황금개미 임계 표본 (Hits+Misses) — 소표본 고승률 어뷰징 차단</summary>
- public const int GoldAntMinSample = 30;
- /// <summary>표본(sample=Hits+Misses)과 적중률(%)로 등급 산정.</summary>
- public static TrackRecordTier Resolve(int sample, decimal hitRate)
- {
- if (sample < MinSample)
- {
- return TrackRecordTier.None;
- }
- if (hitRate >= GoldAntHitRate && sample >= GoldAntMinSample)
- {
- return TrackRecordTier.GoldAnt;
- }
- if (hitRate >= GoldHitRate)
- {
- return TrackRecordTier.Gold;
- }
- if (hitRate >= SilverHitRate)
- {
- return TrackRecordTier.Silver;
- }
- if (hitRate >= BronzeHitRate)
- {
- return TrackRecordTier.Bronze;
- }
- return TrackRecordTier.None;
- }
- }
|