상세 컨텐츠

본문 제목

[Python] 파이썬으로 로또 번호 추출 프로그램 예제

IT & Programming/파이썬 (Python) 공부

by 그림아이 2023. 4. 6. 02:00

본문

반응형

 

이번 시간에는 파이썬으로 임의의 수를 무작위로 추출해주는 방법에 대해 알아보겠습니다. 모든 프로그램 언어는 난수(Random Number, 亂數)를 출력해주는 함수를 가지고 있습니다. 수학의 확률과 통계에서 높은 비중을 차지하고 있기 때문입니다.

 

파이썬에도 당연히 난수를 출력해주는 라이브러리와 함수가 있습니다. 이름 그대로 random입니다. 코딩이라고 할 것도 없이 매우 간단합니다. 내용은 다음과 같습니다.

import random

print(random.randint(0,9))

 

0에서 9까지 10개의 숫자 중 하나를 무작위로 출력해줍니다.

 

이렇게 무작위로 숫자를 추출하는 방법을 알고 나면 확률과 통계의 꽃이라 할 수 있는 ‘로또’가 가장 먼저 떠오릅니다. 저만 그런가요? 사실 프로그램 언어를 공부할 때마다 저는 로또 번호 생성기를 하나씩 만들어봤습니다. 하다 보면 알겠지만 로또 번호 생성기를 만들게 되면 코딩에 필요한 중요한 스킬들을 접할 수 있습니다. 욕심이 생기기 때문입니다.

 

오늘은 가벼운 마음으로 숫자 여섯 개만 추출해주는 프로그램을 만들어볼까 합니다. 명심하실 점은 여기에 예제로 나온 숫자들로 구매하시거나, 코딩 예제로 만든 숫자들로 구매하셔서 당첨 안됐다고 저에게 항의하지 마시라는 점입니다. 순수하게 파이썬 공부에만 활용하시기 바랍니다. 수학의 확률과 통계 분야는 워낙 불확실성이 크고 도저히 이해가 안 되니 어떻게든 이해를 해보고 싶어서 만든 분야일 뿐입니다. 로또 번호와 주가지수는 과거 데이터로는 절대로 정확히 맞출 수가 없습니다.

 

숫자 하나 추출하는 방법은 위에서 배웠으니 알겠는데6개는 어떻게 할까요? 접근하는 방식에 따라 다르겠지만 일단 생각나는 방법은 while 구문으로 6번 반복시키거나, for 구문으로 6번 반복시키는 방법이 있습니다. 둘 다 해보겠습니다.

 

먼저 while 구문입니다.

import random

a = []
n = 0

while n < 6:
    b = random.randint(1,45)
    a.append(b)
    n = n + 1

print(a)

 

그랬더니 저는 아래와 같이 결과값이 출력되었습니다.

 

[29, 5, 38, 41, 3, 21]

 

보기가 좀 그러니 낮은 수부터 정렬시키기 위해a.sort() 를 넣고 다시 해봤습니다. 

 

[10, 12, 13, 18, 22, 42]

 

어떤 분은 이렇게 물어볼 수도 있습니다. “while 구문으로 무한반복 구문을 만들어 숫자 6개가 채워지면 탈출시키면 안 되나요?” 라고요. 됩니다. 안 되는 게 어딨습니까. 숫자 6개만 만들면 되니까요. 이 방법은 마지막에 설명 드리겠습니다.

 

숫자 6개가 문제 없이 출력되었습니다. 이제 for 구문으로 똑같이 해보겠습니다.

import random

a = []

for i in range(6):
    b = random.randint(1,45)
    a.append(b)

a.sort()
print(a)

 

실행시키면 역시 숫자 6개가 제대로 출력되는 것을 확인하셨을 것입니다. 숫자는 그만 보여 드리겠습니다.

 

반응형

 

여기에서 끝낼 수도 있습니다. 그러나 한 가지 놓치고 있는 점이 있는데 뭔지 아시겠습니까? 코딩에서 가장 중요한 점 중의 하나가 바로 발생 가능한 문제점을 예상하는 능력입니다.

 

위에서 우린 숫자 6개를 추출했지만, 정말 항상 6개일까요? 아닐 수 있는 가능성이 있습니다. 왜냐하면 6번을 독립적으로 숫자를 추출했으므로 같은 숫자가 추출되어 중복될 가능성도 배제할 수 없기 때문입니다. 이렇게 되면 무작위 난수를 6개를 추출하려고 했는데 아닐 수도 있는 것입니다. 물론 중복도 상관 없다면 여기까지만 하고 끝낼 수도 있지만, 우리가 이번 시간에 구현하고자 하는 것은 중복된 숫자를 허용해서는 안 되는 로또 번호 생성기이라는 점을 잊어서는 안 됩니다.

 

여기에서 저는 while 무한반복 구문을 이용해서 중복되면 무한 루프를 돌아 계속 추출하고, 중복되지 않을 때만 탈출시키도록 해보겠습니다. 중복 여부의 체크는set 함수로 가능합니다. 

 

import random

a = []

while True:
    if len(a) == 6:
        break
    else:
        a = []
        for i in range(6):
            b = random.randint(1,45)
            a.append(b)
        a = list(set(a))

a.sort()
print(a)

 

이제 완벽해졌습니다. 주의하실 점은 else 아래에 a=[ ]로 리스트 a를 초기화 시켜줘야 한다는 점입니다. 그렇지 않으면 a 리스트에 계속 숫자가 늘어나 무한반복 구문을 빠져나갈 수 없게 됩니다.

 

알고리즘을 말로 간단히 설명하면, 비어있는 리스트 a를 만들고 숫자 6개를 추출해서 리스트 a에 넣고 set함수로 중복 숫자를 제거한 후 리스트 개수가 6개면 무한 루프를 탈출하고, 6개가 아니면 리스트 a를 초기화하고 다시 추출하도록 한 것입니다.

 

제가 만든 것이 정답은 아닙니다. 저는 정답이라고 글을 쓰거나 자랑하려고 올리는 것이 아닙니다. 저는 부족한 것 투성이임을 누구보다 잘 알고 있습니다. 그래서 공부를 놓지 못하고 계속하는 것입니다. 반복해서 말씀 드리지만, 저도 처음 공부 시작할 때 누군가에게 도움을 받았으니, 저도 누군가에게 도움을 드리고자 할 뿐입니다. 시작할 때의 그 막막함과 답답함을 저는 너무 잘 알고 있으니까요.

 

끝으로…

 

프로그램 언어 공부는 이렇게 갑자기 만들고 싶은 것이 있어야 실력이 향상됩니다. 함수를 잔뜩 외운다고 늘지 않습니다. 직접 프로그램을 만들어 보고, 책이나 인터넷에서 남이 만든 코딩을 영어 해석하듯이 해석해보고, 때론 응용도 하면서 씹고, 뜯고, 맛보고, 즐기고 해야 합니다. 저도 그랬습니다. 

 

세상 모든 것이 그러하듯이, 코딩도 꾸준히 하다 보면 실력이 늡니다.

 

728x90
반응형

관련글 더보기

댓글 영역