파이썬으로 로또 번호 생성하기

오늘은 파이썬으로 로또 번호 생성하는 것을 해볼거예요. 지난번에 로또 번호 생성할 수 있는 오픈 소스를 가져다가 변형해서 웹페이지를 만들어보기도 했는데요. 

 

2020/03/23 - [IT/Dev] - 다들 한번쯤 해본다는 '로또 번호 생성기' 만들어 보는 중 (1)

2020/04/28 - [IT/Dev] - 다들 한번쯤 해본다는 '로또 번호 추출기' 만들어 보는 중 (2)

 

결과물은 아래 링크에서 확인해보실 수 있습니다.

 

Lotto

 

www.storyblock.kr

이때는 주로 한 작업이 소스를 조금 수정하고 디자인을 붙여서 온라인으로 올려보는 작업이었다면, 오늘은 파이썬을 이용해서 직접 코드를 입력하고 번호가 생성되는 것을 확인해보는 과정이 되겠습니다.

 

파이썬으로 로또번호 생성하기

 

파이썬 RANDOM() 함수

저는 요즘 비주얼 스튜디오 코드(Visual Studio Code)를 설치하고 파이썬을 조금씩 공부해보고 있는데요. 처음부터 꾸준히 하지는 못하고 유튜브도 보고 이것저것 기웃기웃하다가 파이썬에 있는 랜덤함수를 이용해서 일정범위에 있는 숫자를 난수로 뽑아 낼 수 있다는 것을 알게 됐습니다. 

원래 random() 함수는 0부터 1 미만의 숫자를 랜덤하게 보여주지만 45를 곱하고 1을 더해준 다음 int()로 감싸주면 소수점 이하의 숫자는 감추고 0이상 45미만의 숫자를 보여주게 되는데요. 여기에 1을 더해줌으로써 1이상 45이하의 숫자를 랜덤하게 뽑을 수 있습니다.

 

파이썬으로 로또번호 생성하기

그런데요, 너무나 간단하게 위와 같이 랜덤하게 숫자는 생성했지만 보시면 숫자가 중복되어 나오기도 하더라구요. 이래서는 로또 번호 생성을 했다고 할 수 없어서 다른 방법을 찾아보게 되었습니다. 

 

파이썬으로 로또(LOTTO) 번호 생성하기

1부터 45까지의 숫자를 생성하면서도 중복되지 않도록 해야 로또 번호로서 의미가 있잖아요. 일단 중복되지 않도록 하는 방법이 여러가지 있을텐데 제가 알게 된 것은 set()이라는 함수입니다. set() 함수는 집합자료형 함수라고 해서 집합에 관한 걸 처리하기 쉽게 만든 자료형 함수라고 합니다. 무슨 말인지 정확히 모르겠지만 아무튼 이 함수의 특징은 중복을 허용하지 않고, 순서도 없다고 하는데요. 순서 없음은 일단 모르겠고, 중복을 허용하지 않는 특징이 제가 필요한 함수입니다.

 

 set()함수가 중복을 허용하지 않는다는 것의 예를 들어보면 hello라고 출력하기 위해 test=set("hello")라고 하고 test를 출력해보면 

아래와 같이 h, o, e, l만 나오고 l이 하나 빠져 있는 것을 볼 수 있습니다. 중복이라 하나가 걸러진 것이죠.

아 그리고 random()함수는 기본숫자 함수가 아니라서 라이브러리를 불러들인 다음에 사용이 가능하다고 합니다. 그래서 사용하기 전에 from random import * 과 같이 먼저 불러오는 명령을 줘야 합니다.

 

화면에 출력해주는 함수는 print() 함수입니다. print('lotto')  같은 방식으로 사용하고 실행시키면 화면에 lotto를 출력해줍니다. 

로또 번호는 6개죠. 그런데 만약 랜덤하게 생성했는데 위와 같이 set에 걸려서 숫자가 하나 비면 안되겠죠. 그래서 len()이라는 함수를 이용해서 양을 계산해야 합니다. 예를 들어, 아래와 같이 len([1,2,3,4,5]) 해보면 안에 있는 숫자의 갯수를 5라고 출력해줍니다.


>>> len([1,2,3,4,5])
5

그럼 숫자가 적으면 더해주는 함수도 있어야 겠네요 뭔가를 덧붙여주는 함수는 add() 함수가 있습니다.

그래서 이부분은 분량이 6보다 적으면 1부터 45까지의 숫자 중에서 하나를 더해주라고 프로그래밍 해야합니다. 언제까지 더해주느냐 하면 6이 될때까지겠죠. 즉,


while len(lotto) < 6:
    lotto.add(randrange(1, 46))

위와 같이 해주면 숫자에 도달할 때까지 랜덤 숫자를 뽑아서 추가해주게 될 거예요.

여기서 randrang()이라는 함수가 나왔는데요. 처음에 사용했던 random()함수는 0이하의 숫자들을 랜덤하게 뽑는 것이라 화면에 복잡하게 코드를 넣어줘야했는데요. randrang()라는 함수는 일정영역 즉 첫수부터 마지막 수 미만의 수를 랜덤하게 뽑아내도록 하는 함수입니다. '미만'으로 적용되기 때문에  randrange 마지막 숫자가 45가 아니라 46이 되었습니다. 이게 불편하면 randrange대신에 randint() 함수를 써도 됩니다. randint() 는 첫수와 마지막수를 포함하여 랜덤하게 추출하는 함수입니다.

 

파이썬에서 리스트가 나오게 하는데는 []대괄호를 사용합니다. 가령 a =[1,2,3,4,5] 해서 a를 명령하면 1,2,3,4,5를 출력해줍니다. 이런식으로리스트 자료를 만들어주는 함수가 있는데 list()입니다. 아래 캡처한 화면을 보면 list("hello") 를 입력하면 글자하나하나를 리스트로 나타내주고 숫자도 리스트로 나타내주는 것을 확인할 수 있습니다. 숫자는 괄호로 한번 더 감싸야하더라구요. 아래 붉은 글씨 부분은 괄호로 한번더 감싸지 않아서 에러가 났습니다.

 

이 리스트 함수에 리스트를 입력해주면 같은 리스트를 보여줍니다. 예를 들어,


>>> a = [1, 2, 3]
>>> b = list(a)
>>> b
[1, 2, 3]

b에 list(a)를 넣어주면 그대로 a의 값인 1, 2, 3을 보여주는 것이죠. 

 

그리고 마지막으로 set() 함수가 순서 상관 없이 출력을 해주므로 좀 더 보기 좋게 숫자를 순서대로 나오도록 해주기 위해 sort() 함수를 사용했습니다. 

 

이렇게 해서 최종적으로 구현한 한 것을 보면 아래와 같습니다.

 

파이썬으로 로또번호 생성하기


from random import *

print('-----------------------')
print('LOTTO 행운번호!')

lotto = set()
lotto_list = []

while len(lotto) < 6:
    #lotto.add(randrange(1, 46))
    lotto.add(randint(1, 45))

lotto_list = list(lotto)
lotto_list.sort()

print(lotto_list)

print('-----------------------')

 


 

마치며,

오늘은 파이썬으로 로또 번호 생성하는 간단한 프로그래밍 - 프로그래밍이라고 하기도 부끄럽게 간단한 것이지만-을 해봤습니다. 저는 항상 느끼는 건데요, Visual Studio Code 같은 이런 비주얼 요소도 거의 없는 텍스트 에디터로 뭔가가 "작동"되도록 하는 것이 신기한 것 같아요. 그리고 개발자 분들이 참 대단하다고 생각합니다. 요렇게 짧은 구문들도 저는 하나하나 신경쓰는 게 쉽지 않거든요. 아마 전혀 모르는 분들은 왜 이렇게 되는지 이해가 안갈겁니다. 저도 그런 부분이 많으니까요. 그런데 더더 길고 복잡한 것도 개발자 분들은 앞뒤가 맞게 서로 영향 주는 것을 생각하면서 작성을 하고 상호작용하게 하잖아요. 정말 대단한 것 같습니다. 

 

오늘은 여기까지 해보겠습니다.

 

고맙습니다!

반응형

댓글

Designed by JB FACTORY