Python 로또 프로그램 구현 실습
파이썬으로 로또(Lotto) 복권의 당첨 번호를 추출하고 주어진 상황의 등수를 구해보며
여러 번 구매하는 시뮬레이션의 결과를 출력하는 과정들을 구현하여
간단한 로또 프로그램을 만들어보는 예시를 다루어 보겠습니다.
로또 당첨 번호 추출
1~45 번호 중 중복 없이 7개를 뽑아 6개는 당첨 번호, 1개는 보너스 번호로 사용하게 됩니다.
이는 넘파이 모듈의 np.random.choice 함수를 활용하면 쉽게 번호를 뽑을 수 있습니다.
import numpy as np
numbers = np.random.choice(np.arange(1, 46), 7, replace = False) # 1~45 중 7개 추출
win_numbers = numbers[:-1] # 당첨 번호 6개
bonus = numbers[-1] # 보너스 번호
print(win_numbers) # [38 42 13 41 44 11]
print(bonus) # 31
로또 당첨 등수 계산
6개의 번호가 들어왔을 때, 당첨 번호와 일치하는 개수를 세어
각 상황에 맞는 등수를 출력해주어야 합니다.
일치하는 당첨 번호 개수는 for문 내에서 if문으로 검사를 하여 세어주면 좋으며,
각 상황의 등수 체크는 if~elif~else문을 활용하면 편리합니다.
구매한 번호(my_num), 당첨 번호(win_numbers) 및 보너스 번호(bonus)가 input으로
들어왔을 때, 등수를 출력하는 함수 lotto는 아래와 같이 구현이 가능합니다.
def lotto(my_num, win_numbers, bonus):
same_cnt = 0 # 일치하는 개수
for num in win_numbers: # 각 당첨 번호 포함 여부 체크
if num in my_num: same_cnt += 1
# 등수 반환
if same_cnt == 6: return 1
elif same_cnt == 5 and bonus in my_num: return 2
elif same_cnt == 5: return 3
elif same_cnt == 4: return 4
elif same_cnt == 3: return 5
else: return 6 # 꽝
# 예시 상황
my_num = [38, 35, 11, 10, 40, 42]
print(lotto(my_num, win_numbers, bonus)) # 5
예시 상황에서는 38, 11, 42 세 개의 번호가 위의 예제에서 추출했던 당첨 번호와 일치하므로
5등이라는 등수 정보가 잘 출력된 것을 볼 수 있었습니다.
로또 구매 시뮬레이션
이제 위의 코드를 바탕으로 여러 차례 로또 복권을 구매하여 각 등수별로 몇 회가 기록되었는지를
구하는 시뮬레이션 과정의 코드를 구현해보도록 하겠습니다.
각 시도마다 구매한 번호 생성도 당첨 번호 추출 과정과 마찬가지로 np.random.choice 함수를
활용하면 편리하며, 여기서는 7개가 아닌 6개의 번호만 추출하는 과정에 유의해주세요.
당첨 횟수 기록은 리스트 내 i번째 인덱스에 i등의 횟수를 기록하는 것으로 구현해두었으며,
꽝은 6등으로 간주하였습니다.(여기서는 가장 앞의 0번 인덱스는 사용하지 않았습니다.)
이 과정에 대한 코드 구현의 예시는 다음과 같았습니다.
lotto_cnt = 100000 # 구매할 로또의 개수
# 당첨 번호 및 보너스 번호 추출
numbers = np.random.choice(np.arange(1, 46), 7, replace = False)
win_numbers = numbers[:-1]
bonus = numbers[-1]
history = [0] * 7 # i번 인덱스에 i등 횟수 기록(0번 인덱스는 사용 X)
# 로또 구매 시뮬레이션
for i in range(lotto_cnt):
my_num = np.random.choice(np.arange(1, 46), 6, replace = False) # 1~45 중 6개 추출
result = lotto(my_num, win_numbers, bonus) # 등수 반환
history[result] += 1 # 결과 기록
# 결과 출력
for i in range(1, 6):
print('%d등 횟수 : %d회'%(i, history[i]))
print('꽝 횟수 : %d회'%history[-1])
예시로, 위의 10만 회 구매 시뮬레이션을 실행해본 결과는 아래와 같이 등장하였습니다.
1등 횟수 : 0회
2등 횟수 : 0회
3등 횟수 : 3회
4등 횟수 : 146회
5등 횟수 : 2268회
꽝 횟수 : 97583회
'Python > 파이썬 기초' 카테고리의 다른 글
파이썬 자료형별 '같다'의 기준 정리(비교연산자 == 기준), 클래스에서 == 및 != 구현 방법(__eq__, __ne__) (0) | 2022.07.13 |
---|---|
파이썬 2차원 배열 선언, 값 추출/변경, 정렬(feat. 리스트, 넘파이 배열) (2) | 2022.05.21 |
파이썬 소요 시간 측정 방법 : time.time() 활용과 %timeit (0) | 2022.05.16 |