카테고리 없음

역대 당첨 번호를 제외한 로또 숫자

Han_Star 2025. 2. 24. 17:44

이 글은

'로또를 살 때, 역대 1,2,3, 등에 해당하는 숫자를 제외한다면,

조금이나마 확률이 올라가지 않을까? 라는 생각에서 시작됩니다.

 

물론 각각의 로또 회차는 독립적이어서 서로에게 영향을 주지 않지만,

'이미 당첨된 로또번호가 또 다시 당첨되지 않을 것이다!'라는 생각 또한 포함하고 있습니다.


lotto.xlsx
0.05MB

1회부터 1160회차의 로또 번호 기록입니다.


 

동행복권에서 발매되는 로또는 45개의 숫자 중에 6개를 맞춰야 합니다.

이때, 맞춘 번호의 갯수에 따라 등수가 결정됩니다.

  • 1등: 메인 번호 6개 모두 일치
  • 2등: 메인 번호 5개 일치 + 보너스 번호 포함
  • 3등: 메인 번호 5개 일치 (보너스 번호 미포함)
  • 4등: 메인 번호 4개 일치 (보너스 번호 미포함)
  • 5등: 메인 번호 3개 일치 (보너스 번호 미포함)

여기서는 1,2,3등만 이야기하기로 합니다.


우선 Excel에서 데이터를 불러옵니다.

# 엑셀 파일에서 로또 당첨번호 데이터를 불러오기.
try:
    lotto = pd.read_excel("lotto.xlsx", index_col=0)
except FileNotFoundError:
    print("lotto.xlsx 파일을 찾을 수 없습니다. 먼저 로또 번호 데이터를 저장해주세요.")
    exit()

 

로또번호를 생성합니다.

# 5개의 로또 조합을 100,000회 생성하며 확인합니다.
for _ in tqdm(range(100000)):
    # 1부터 45까지의 숫자 중 6개를 중복 없이 랜덤 선택 후 정렬
    random_numbers = sorted(random.sample(range(1, 46), 6))
    random_set = set(random_numbers)

 

생성된 로또번호를, 엑셀과 비교하여 1,2,3등이었는지를 확인합니다.

    # 엑셀에 저장된 각 회차의 당첨번호와 비교
    for round_idx, row in lotto.iterrows():
        main_numbers = [row['1번째'], row['2번째'], row['3번째'], 
                        row['4번째'], row['5번째'], row['6번째']]
        bonus = row['보너스']
        main_set = set(main_numbers)
        
        # 메인번호 중 몇 개가 일치하는지 계산
        match_count = len(random_set.intersection(main_set))
        
        if match_count == 6:
            # 1등: 메인번호 6개 모두 일치
            win_status = "1등"
            win_rounds.append(str(round_idx))
            win_numbers.append(f"{main_numbers} / 보너스: {bonus}")
        elif match_count == 5:
            # 5개 일치 시, 보너스 번호 포함 여부에 따라 2등 또는 3등 판별
            if bonus in random_set:
                win_status = "2등"
                win_rounds.append(str(round_idx))
                win_numbers.append(f"{main_numbers} / 보너스: {bonus}")
            else:
                win_status = "3등"
                win_rounds.append(str(round_idx))
                win_numbers.append(f"{main_numbers} / 보너스: {bonus}")

 

결과를 데이터프레임으로 만들어서 출력합니다.

    # 각 조합에 대한 결과를 리스트에 추가
    results.append({
        "랜덤번호": random_numbers,
        "당첨여부": win_status,
        "당첨회차": win_rounds_str,
        "당첨번호": win_numbers_str
    })

# 결과를 DataFrame으로 만들어 가로로 출력
result_df = pd.DataFrame(results, columns=["랜덤번호", "당첨여부", "당첨회차", "당첨번호"])
#print(result_df)

 

사실 제목에는 '역대 당첨 번호를 제외한 로또 숫자'라고 적었지만,

정확하게는 '랜덤하게 생성된 로또번호가 몇 등 당첨되었는가?'가 맞는 거 같네요.

 

또한 만들었으니, 시뮬레이션을 돌려보았습니다.

for _ in tqdm(range(100000)):

 

10만번을 두 번 돌려보았습니다.

10만번 , 3등 50번 2등 3번
1등이 20번...?

20만 번 돌려서 1등이 20번..?  만 번에 1등이 한번...?

시뮬레이션 결과를 보고 솔직히 두눈을 의심했습니다.

진짜 1등이 20번이다.?

 

한 번호에 대하여 1160회차까지를 전부 확인하는 것이기에, 당첨 확률이 최소 1160배는 높기는 하지만,

그래도 높게 나오지 않았나 생각합니다.

(할만한가?)

 

2회차에 2시간 30분 걸린 건 다른 파일도 주피터 노트북에서 돌리고 있었기 때문에 저런 결과가 나온 것 같습니다.

1회 차는 30분 걸렸었나?

 


아래는 전체 코드입니다.

import random
import pandas as pd
import time
from tqdm import tqdm

# 엑셀 파일에서 로또 당첨번호 데이터를 불러오기.
try:
    lotto = pd.read_excel("lotto.xlsx", index_col=0)
except FileNotFoundError:
    print("lotto.xlsx 파일을 찾을 수 없습니다. 먼저 로또 번호 데이터를 저장해주세요.")
    exit()

results_2 = []  # 결과 저장 리스트

# 5개의 로또 조합을 5회 생성하며 확인합니다.
for _ in tqdm(range(5)):
    # 1부터 45까지의 숫자 중 6개를 중복 없이 랜덤 선택 후 정렬
    random_numbers = sorted(random.sample(range(1, 46), 6))
    random_set = set(random_numbers)
    
    # 초기 당첨 여부는 기록 없음으로 설정
    win_status = "당첨기록이 없는 번호입니다."
    win_rounds = []   # 당첨된 회차 저장 리스트
    win_numbers = []  # 당첨번호(메인+보너스) 저장 리스트

    # 엑셀에 저장된 각 회차의 당첨번호와 비교
    for round_idx, row in lotto.iterrows():
        main_numbers = [row['1번째'], row['2번째'], row['3번째'], 
                        row['4번째'], row['5번째'], row['6번째']]
        bonus = row['보너스']
        main_set = set(main_numbers)
        
        # 메인번호 중 몇 개가 일치하는지 계산
        match_count = len(random_set.intersection(main_set))
        
        if match_count == 6:
            # 1등: 메인번호 6개 모두 일치
            win_status = "1등"
            win_rounds.append(str(round_idx))
            win_numbers.append(f"{main_numbers} / 보너스: {bonus}")
        elif match_count == 5:
            # 5개 일치 시, 보너스 번호 포함 여부에 따라 2등 또는 3등 판별
            if bonus in random_set:
                win_status = "2등"
                win_rounds.append(str(round_idx))
                win_numbers.append(f"{main_numbers} / 보너스: {bonus}")
            else:
                win_status = "3등"
                win_rounds.append(str(round_idx))
                win_numbers.append(f"{main_numbers} / 보너스: {bonus}")

    # 당첨 회차와 당첨번호가 여러 건이면 콤마로 연결
    win_rounds_str = ", ".join(win_rounds) if win_rounds else ""
    win_numbers_str = ", ".join(win_numbers) if win_numbers else ""
    
    # 각 조합에 대한 결과를 리스트에 추가
    results_2.append({
        "랜덤번호": random_numbers,
        "당첨여부": win_status,
        "당첨회차": win_rounds_str,
        "당첨번호": win_numbers_str
    })

# 결과를 DataFrame으로 만들어 가로로 출력
results_2 = pd.DataFrame(results_2, columns=["랜덤번호", "당첨여부", "당첨회차", "당첨번호"])
results_2

현재 5개로 낮춰놓은 상태입니다.

5개만 해보자

당첨기록이 없는 5세트의 로또번호가 나왔군요!

약간은 당첨확률이 높지 않을까요?


여담.

글에서 결과로 나온 로또번호를 실제로 구매했었습니다.

이게 왜 당첨되었을까요 ㅋㅋㅋㅋ 운이 좋군요.