Python/파이썬 기초

파이썬 로또 번호 추출, 당첨 등수 구하기 및 구매 시뮬레이션 구현 예제

jimmy_AI 2022. 7. 7. 11:30
반응형

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회