이 글은
'로또를 살 때, 역대 1,2,3, 등에 해당하는 숫자를 제외한다면,
조금이나마 확률이 올라가지 않을까? 라는 생각에서 시작됩니다.
물론 각각의 로또 회차는 독립적이어서 서로에게 영향을 주지 않지만,
'이미 당첨된 로또번호가 또 다시 당첨되지 않을 것이다!'라는 생각 또한 포함하고 있습니다.
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만번을 두 번 돌려보았습니다.
20만 번 돌려서 1등이 20번..? 만 번에 1등이 한번...?
시뮬레이션 결과를 보고 솔직히 두눈을 의심했습니다.
한 번호에 대하여 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세트의 로또번호가 나왔군요!
약간은 당첨확률이 높지 않을까요?
여담.
글에서 결과로 나온 로또번호를 실제로 구매했었습니다.
이게 왜 당첨되었을까요 ㅋㅋㅋㅋ 운이 좋군요.