이 글은 "로또 맞히는 법"이 아니다. 확률적으로 불가능하다는 거 나도 알고 있고, 그냥 통계를 어디까지 활용할 수 있나 연구한 기록이다. 코드 짜는 게 재밌어서 시작했고, 어쩌다 보니 꽤 쓸만한 도구가 됐다.
어디서 시작했냐면
처음엔 진짜 단순했다. 자리별(1번째 공, 2번째 공...) 출현 빈도를 뽑아서 가중치를 주면 나름 그럴듯한 번호가 나오더라고. 그게 v1이었고, 거기서 욕심이 생기기 시작했다.
"핫넘버도 넣어볼까? 콜드넘버는? 최근 30회 추세는? 번호 간격 패턴은?" 이러다 보니 어느새 알고리즘이 12개가 됐다. 그리고 각각을 비교하려다 보니 테스트 모드도 생겼고, 필터도 붙었고... 결국 꽤 덩치 있는 도구가 됐다.
12가지 알고리즘
현재 지원하는 방식은 이렇다.
| 알고리즘 | 설명 |
|---|---|
| 자리별 가중치 | 각 자리의 출현 빈도 기반 (기본값) |
| 순수 랜덤 | 통계 없음, 완전 무작위 |
| 총 당첨횟수 | 번호별 누적 출현 횟수 |
| 가중치+당첨횟수 | 자리 가중치 × 총 출현 횟수 복합 |
| 갭 패턴 | 번호 간 간격의 역대 분포 반영 |
| 홀짝·고저 균형 | 실제 당첨 조합의 홀짝/고저 비율 따라가기 |
| 핫넘버 | 자주 나온 번호 우선 |
| 콜드넘버 | 오랫동안 안 나온 번호 우선 |
| 최근 N회 빈도 | 최근 30회(기본) 트렌드 반영 |
| 구간 균형 | 1 |
| 동반출현 쌍 | 함께 자주 나온 번호 조합 우선 |
| 과열 제거 | 최근 5회 연속 과다 출현 번호 제외 |
알고리즘마다 번호 뽑는 방식이 완전히 다르다. 예를 들어 갭 패턴은 첫 번째 번호를 뽑고, 그 뒤 번호들은 실제 당첨 번호들의 간격 분포를 따라 순차적으로 생성한다. 동반출현 쌍은 역대 당첨에서 자주 같이 나온 번호끼리 묶어서 조합을 구성하고.
필터도 달았다
번호를 생성하더라도 통계적으로 말이 안 되는 조합은 솎아내는 필터가 있다. 실제 역대 당첨 번호 데이터를 기준으로 "이 범위 안에 드는 조합만 쓸만하다"고 판단하는 거다.
- 합계 범위 — 역대 당첨 번호 합계의 하위 5% ~ 상위 5% 안에 들어야 함
- 홀짝 균형 — 홀수가 2~4개
- 고저 균형 — 22 이하 저번호가 2~4개
- 연속번호 — 최소 1쌍 이상의 연속 번호 포함
- 같은 십의 자리 제한 — 동일 십의 자리 번호가 4개 이상이면 탈락
세트 하나당 최대 500번 시도해서 조건을 통과하는 것만 내보낸다. 필터 통과율도 화면에 같이 표시되니까 알고리즘마다 통과율이 얼마나 다른지 비교해보는 것도 재미있다.
테스트 모드가 핵심이다
솔직히 이 기능이 없으면 그냥 번호 생성기랑 다를 게 없다.
테스트 모드에서는 특정 회차를 기준 시점으로 설정하면, 그 회차까지의 데이터로만 학습해서 번호를 생성하고 실제 다음 회차 당첨 번호와 비교한다. 몇 개 맞았는지 일치 개수 기준으로 정렬해서 보여주고, 알고리즘별 성능도 대략 비교해볼 수 있다.
예를 들어 1100회차 기준으로 돌리면 → 1101회차 실제 당첨 번호와 비교 → "이 알고리즘은 3개 일치가 몇 세트, 2개 일치가 몇 세트" 식으로 통계가 나온다.
만들면서 느낀 것
12가지 알고리즘을 다 구현하고 테스트 모드로 돌려보고 나서야 명확하게 깨달았다. 로또는 독립 시행이라서 과거 데이터가 미래에 전혀 영향을 주지 않는다. 어떤 알고리즘도 일관되게 잘 맞히지 못한다. 당연한 결론이다.
그럼에도 이 작업이 의미 있었던 건 두 가지다.
하나는, 통계 데이터를 코드로 직접 구현하면서 확률적 사고를 꽤 많이 훈련했다. 가중치 샘플링, 분포 기반 생성, 조합 필터링 같은 것들을 실제로 손으로 짜봤다는 거.
다른 하나는, 어떤 조합이 통계적으로 현실적인가를 판단하는 기준을 만들었다는 거다. "합계가 너무 낮거나 너무 높은 조합은 역대 당첨에서 거의 없었다"는 식의 필터 자체는 확률과 무관하게 의미 있는 데이터다.
요약하면 — 로또 맞히려고 만든 게 아니라, 만들다 보니 많이 배웠다.
📷 [스크린샷: 통계 차트 — 합계 분포, 홀짝 비율, 구간별 출현 빈도]
서비스 주소: https://redinfo.co.kr/plus/lotto