programming

파이썬으로 로또 추첨기 만들기와 상세 설명


by Kitle · 2022. 04. 30.



안녕하세요. 저도 대박을 꿈꾸지만 늘 꿈만꾸고 인생역전은 못하고 인생 여전하군요.

아쉬운 마음으로 가상세계에서나마 로또 1등을 꿈꿔봅니다.

오늘은 python으로 로또 추첨기를 만들어볼겁니다. 단순히 만드는 것에 그치지 않고, 현실 세계를 프로그래밍으로 그대로 옮길수 있는 점은 늘 재미있는것 같습니다. 최대한 이해도 쉽고 친절하게 설명해볼테니 잘 따라와 주세요.


추첨통 만들기

로또 추첨통에는 1~45개의 숫자가 들어 있습니다. 각각의 숫자가 담긴 공을 만들고 이를 추첨통에 집어넣어야 겠죠. 프로그래밍에서는 어떻게 할까요? 자료 구조를 만들고 그 안에 각각의 숫자를 집어넣으면 되겠습니다.

파이썬에서는 리스트형의 자료구조를 활용하고 이안에 각각 숫자를 넣는 방식을 써볼게요.

numbers = list(range(1, 46))
print(numbers)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]

range를 활용해 1부터 45까지 숫자를 범위로 지정하고 이를 리스트로 감싸면 해당 범위의 리스트가 만들어 집니다. 다만 range의 뒷 자리수는 이를 넘지않는 수를 만드므로 +1임을 유의해야 합니다. 그리고 출력해보면 [] 리스트로 감싸여진 리스트가 만들어집니다.


추첨통 섞고 추첨 하나씩 하기

다음은 추첨 시작입니다. 추첨통을 섞는 방식은 리스트를 무작위로 위치를 바꿔주는 방식으로 섞을 수 있고, 실제로 리스트에서 아이템을 뽑거나, 아니면 애초부터 랜덤한 위치의 아이템을 뽑는 방법도 있습니다.

여기서는 약간의 꼼수를 이용해 리스트를 섞고 맨 앞에서부터 7개의 숫자를 뽑겠습니다. 7개인 이유는 1등 6번호와 보너스 1개의 번호기 때문입니다.

import random 
numbers = list(range(1, 46))
random.shuffle(numbers)
print(numbers)
selected_numbers = numbers[:7]
print(selected_numbers)
---
[35, 28, 5, 33, 41, 27, 18, 34, 9, 1, 13, 3, 7, 4, 19, 37, 12, 16, 6, 22, 14, 25, 20, 40, 24, 29, 43, 44, 15, 30, 32, 11, 21, 36, 38, 23, 31, 10, 39, 8, 17, 45, 26, 2, 42]
[35, 28, 5, 33, 41, 27, 18]

random.suffle을 이용해 섞어주면 무작위의 숫자가 배치됩니다. 그다음은 리스트 슬라이스를 이용하여 7개의 숫자를 잘라줍니다. [:7]은 [0:7]과 같이 맨 처음부터 시작입니다. 인덱스는 0부터라 0,1,2,3,4,5,6 위치를 가져와서 총 7개가 가져와집니다.

요렇게 셔플 후에는 값들이 막 섞였고, 앞에서부터 7개를 잘라 실제 추첨된 번호로 만들었습니다.


번호 정렬하고 만들기

실제 추첨 사이트가 어떻게 출력되는지 볼까요?

요렇게 순서대로 정렬되고 마지막 보너스 번호는 + 를 넣어 맨 뒤에 표시했습니다. 디자인 적인 부분은 제외하고 비슷하게 만들어보죠.

import random 
numbers = list(range(1, 46))
random.shuffle(numbers)
selected_numbers = numbers[:7]
lucky_numbers = selected_numbers[:6]
lucky_numbers.sort()
lucky_numbers = ' '.join(str(num) for num in lucky_numbers)
bonus_number = selected_numbers[6]
print(f'{lucky_numbers} + {bonus_number}')
-----
11 17 25 31 32 36 + 20

실제 7개의 번호를 추출했지만 마지막 보너스 번호는 + 뒤에 나와야 하므로 모두 정렬하면 안됩니다. 따라서 6개만 짤라서 정리하고 나머지 보너스 번호는 무조건 맨 마지막에 출력해야 합니다.

자른 리스트는 그대로 출력하면 [35, 28, 5, 33, 41, 27, 18] 이런 느낌일 것이므로 []와 , 를 제거하고 번호사이에 공백으로 띄워주면 이쁘게 나올겁니다. 이는 ' '.join과 for 문을 사용해 하나의 원소들을 모두 공백과 함께 하나의 스트링으로 만들수 있습니다. 정렬 다음에 오는 문장입니다. 그다음 7개의 추출한 숫자중 마지막 번호는 + 뒤에 무조건 찍으면 끝입니다.

출력은 f스트링을 활용하여 출력 결과물을 한번 볼까요? 실제와 유사하게 나왔습니다. 출력마다 물론 값은 달라질겁니다. 이외에도 얼마든지 방법과 더 짧고 간결한 코드도 많을겁니다.

다만 실생활의 내용을 알고리즘으로 옮길때 실제와 유사하게 생각해보는 것도 의외로 도움이 많이 되니 이런식으로 개념을 잡고 한번 그다음 더 좋은 코드를 생각해 보는것도 많은 도움이 될 것입니다.