제목을 바꿔봤다. '만들어 볼까?' 보다는 '맞춰 볼까?'라고 해야 기술의 힘을 빌어 일확천금을 노린다는 뉘앙스가 더 강한 것 같지 않나?
이전 글에서는 우발적으로 파이썬을 이용해서 당첨 가능한 로또 번호를 추려보자는 생각에 무작위 번호 추출기 (Random Number Generator) 제작 프로젝트를 시작했다.
2024.07.15 - [프로그래밍] - [Python] 로또 번호를 만들어 볼까? #1
알고리즘은 단순하다.
먼저 1부터 45사이의 숫자들 중 6개를 중복 없이 뽑았을 떄 나올 수 있는 모든 숫자의 조합을 만들고 거기서 나올 확률이 없는 조합을 제거해 가는 것이다. 그래서 이미 당첨된 번호를 제외하는 것까지 만들었다. 그렇게 남은 조합의 개수가 8,143,932개... 이걸로는... 그냥 랜덤하게 6개 만드는 거나 별반 차이가 없다.
그래서 두번째로,
지금까지 당첨된 번호들 중에 3개 이상 연속된 숫자가 있는 조합이 몇개나 되는지 알아보기로 했다. 아무래도 연속 번호가 나오기는 어려울테니... 1,2,3,4,5,6.. 이렇게 나오긴 어렵지 않겠나... 아마도 혼자 독식을 하기 위해 이런 조합으로 베팅하는 사람도 있을 것 이다.
https://news.mt.co.kr/mtview.php?no=2024071320471857188
"이게 실화냐"... 1등 당첨금이 약 4억 2천만원이란다. 세금 떼면 3억정도 된다는데 물론 천원 베팅해서 얻을 수 있는 수익으론 엄청난 금액이지만 우리가 로또를 살 때 기대하는 금액과는 거리가 멀어도 한참 멀다. 인생역전이 아니라
인생 여전
1128회까지 나온 번호들 중에 3개 이상의 번호가 연속된 조합을 찾아봤다.
def has_three_consecutive(numbers):
"""
숫자 리스트에 3개 이상의 연속 숫자가 있는지 확인합니다.
Args:
numbers: 숫자 리스트 (예: [23, 12, 4, 35, 17, 8])
Returns:
3개 이상의 연속 숫자가 존재하면 True, 그렇지 않으면 False
"""
for i in range(len(numbers) - 2):
if numbers[i] + 1 == numbers[i + 1] and numbers[i + 1] + 1 == numbers[i + 2]:
return True
return False
# Pandas를 사용하여 엑셀 파일 읽기
data = pd.read_excel(excel_file_path, sheet_name=sheet_name)
# B, C, D, E, F, G 컬럼의 값들을 2열부터 리스트로 변환
columns = ["번호1", "번호2", "번호3", "번호4", "번호5", "번호6"]
excluded_numbers = data[columns].values.tolist()
excluded_numbers_cnt = 0
for index, excluded_number in enumerate(excluded_numbers):
if has_three_consecutive(excluded_number):
excluded_numbers_cnt += 1
print(excluded_numbers_cnt, ":", excluded_number)
rate_ex = excluded_numbers_cnt / len(excluded_numbers)
print(excluded_numbers_cnt, "/", len(excluded_numbers), '=', rate_ex)
이전 글에서 사용했던 1128회차까지의 당첨 번호 파일을 읽어 3개 이상 연속된 번호가 있는 조합을 추려내고 전체 숫자 조합 중에 차지하는 비율을 구한다.
결과는,
63 / 1128 = 0.05585106382978723
약 5% 정도 된다. 물론 3개, 4개, 5개, 6개로 나눠봐야겠지만 그건 나중에 앱 만들게 되면 선택 옵션으로 줘도 좋을 것 같다. 5% 정도의 확률이라면 빼도 되겠다 싶다.
그래서 빼봤다.
for index, possible_number in enumerate(rest_numbers):
if has_three_consecutive(possible_number):
print(possible_number)
rest_numbers.remove(possible_number)
print(len(rest_numbers))
지난 번 글에 사용했던 rest_numbers는 전체 조합에서 이미 당첨된 번호를 제외한 나머지 조합들이다.
무식하게 for문으로 돌렸다. 마음이 급했다... 이번 주 로또 당첨일이 다가왔으므로...
그런데... 이 번호 뽑는데만 최소 6시간쯤 걸린 것 같다. 너무 오래 걸려서 걸어놓고 잤다. 그리고 나온 결과는 저장을 못 했지만 그렇게 다 빼도 약 700만개 조합이 남는다. 하아...
그런데 그것보다 더 심각한 문제는...
for 문 밖에 답이 없느냐이다.
1부터 45사이에 3개 이상의 연속된 숫자 조합을 뽑는 것은 시간이 오래 걸리지 않는다. 그걸 800여만개의 숫자 조합에서 빼는 연산을 하는 하는 좋은 방법이 없을까?
'프로그래밍' 카테고리의 다른 글
CSS와 HTML로 tooltip 구현하기 (0) | 2025.01.21 |
---|---|
[Python] 로또 번호를 만들어 볼까? #1 (1) | 2024.07.15 |
Flowbite Svelte #10 - Svelte와 Vue.js, React.js 비교 (0) | 2024.07.13 |
Flowbite Svelte #8 - Button Component (0) | 2024.07.11 |
Flowbite Svelte #5 - Flowbite Svelte 사용 예제 (0) | 2024.07.08 |