파이썬 프로그래밍

파이썬 로또 번호 추출기 및 시뮬레이터 만들기

코니코니 2022. 10. 1. 12:00
반응형

파이썬 로또 번호 추출기 및 시뮬레이터 만들기


원래 로또에 관심이 없었지만 이번에 런닝을 하다 새똥을 맞은 날 로또를 샀더니 5등이 당첨됐습니다. 물론 5등이 될 확률은 높은 편이지만 5등이 되는 바람에 또 로또를 살 일이 생겨버렸죠.

로또 1등이 될 확률은 800만분의 1이 넘는다고 해서 한번 직접 시뮬레이터를 만들어서 테스트를 해봤습니다. 시뮬레이터는 실제로 로또 번호를 뽑는 것보다 아주 조금 더 확률을 높여서 코드를 작성했습니다. 통계적으로 봤을 때 가장 첫번째 번호는 노란색인 경우(1~10번)가 많다는 점과 가장 마지막 번호는 30 후반대 번호부터 40번대 번호가 많은 것을 고려하여 작성을 했는데 어쨌든 확률이 매우 낮은 것은 마찬가지입니다.

import random
import sys
 
LCount = 0
 
while True:
    MatchNumber = 0
    LottoList = []
    # 5개의 랜덤번호 생성
    while len(LottoList) != 5:
        Lotto = random.sample(range(1, 46), 6)
        Lotto.sort()
        if Lotto[0] < 11:
            if Lotto[5] >= 38:
                LottoList.append(Lotto)
    LCount += 1
    # 1개의 당첨번호 생성
    while True:
        TestNum = random.sample(range(1, 46), 6)
        TestNum.sort()
        if TestNum[0] < 11:
            if TestNum[5] >= 38:
                break
    # 생성한 5개 랜덤번호와 1개의 당첨번호 대조
    for i1 in LottoList:
        for i2 in range(6):
            if i1[i2] == TestNum[i2]:
                MatchNumber += 1
        if MatchNumber == 6:
            print(f'{i1} 1등 당첨!')
            print(f'총 5게임 {LCount}번 구매')
            input()
            sys.exit()
        if MatchNumber == 5:
            print(f'{i1} 5개 일치!')
            print(f'총 5게임 {LCount}번 구매')
        MatchNumber = 0

먼저 로또 당첨 시뮬레이터는 위와 같습니다. 구조는 매우 간단하죠. 먼저 반복문에서는 한번 돌 때마다 5개의 게임과 1개의 당첨번호를 랜덤으로 생성합니다. 매주 5게임(5천원)을 구매하면서 그 주의 새로운 당첨번호와 대조를 하는 방식이라고 보면 될것 같은데 확률을 조금 올렸는데도 불구하고 아주 무시무시한 극악의 확률을 자랑합니다. 1등 당첨까지 총 5번의 테스트를 해봤는데 결과는 다음과 같습니다.

[5, 11, 32, 33, 37, 45] 1등 당첨!
총 5게임 1528289번 구매
 
[1, 3, 10, 23, 34, 44] 1등 당첨!
총 5게임 283276번 구매
 
[1, 9, 13, 27, 30, 41] 1등 당첨!
총 5게임 579907번 구매
 
[5, 11, 26, 27, 37, 43] 1등 당첨!
총 5게임 기준 1624183번 구매

반복이 될 때마다 새로운 5개의 랜덤번호와 1개의 당첨번호를 생성하면서 대조작업을 한 결과입니다. 실제상황이라고 했을 때 금액이나 기간적으로 당첨은 거의 불가능에 가까운 수치라고 볼 수 있겠죠. 그럼에도 불구하고 매주 당첨자가 나오고 있습니다. 그래서 우리는 벼락 맞을 확률보다도 낮은 1등을 기대하며 매주 로또를 사는 것은 아닐까요.. 슬픈 현실입니다.

import random
 
"""
Lotto Number Generator
 
Num 1 = 11 Down
Num 2 = None
Num 3 = None
Num 4 = None
Num 5 = None
Num 6 = 38 ~ 45
"""
 
LottoList = []
 
while len(LottoList) != 10:
    Lotto = random.sample(range(1, 46), 6)
    Lotto.sort()
    if len(LottoList) + 1 == Lotto[0]:
        if Lotto[5] >= 38:
            LottoList.append(Lotto)
 
for i in LottoList:
    print(i)

로또 시뮬레이터에 비해서 로또 번호 추출기는 더 간단하게 코드를 짤 수 있습니다. 그래봤자 랜덤 번호를 추출하는 정도 밖에 안되니까요. 위 코드는 총 10개의 게임을 랜덤으로 생성합니다. 거기서 추가되는 옵션이 몇가지 있는데 우선 총 10개의 게임의 첫번째 숫자는 1부터 10까지 겹치지 않게 하나씩 나와야 한다는 것이고 마지막 숫자는 38에서 45 사이일 때 리스트에 추가를 하도록 코드를 작성했습니다.

[1, 13, 19, 30, 37, 42]
[2, 7, 8, 9, 10, 42]
[3, 4, 18, 30, 36, 41]
[4, 6, 8, 16, 30, 44]
[5, 8, 16, 20, 34, 41]
[6, 25, 31, 33, 37, 43]
[7, 16, 25, 40, 42, 44]
[8, 20, 25, 28, 43, 45]
[9, 10, 13, 39, 40, 44]
[10, 20, 24, 25, 41, 44]
 
Process finished with exit code 0

특별히 로또를 분석하면서 코드를 짠 것은 아니기 때문에 이런식으로 간단하게 만들 수 있다는 것만 참고하면 될 것 같습니다. 참고로 이 방법으로 1번에서 5번까지 5게임 사자마자 5천원 당첨이 됐네요. 본전치기에 5등은 흔한 일이겠지만~ 먼 훗날의 1등을 기원하며..

반응형