항상 왜 1개이상 맞기 힘든걸까, 로또 시뮬레이터

최근 주간에 텅텅 비어버린 통장과 지친일상을 달래기위해 회사동료와 함께 로또를 몇번 구매를 해봤습니다.

오랫만에 로또라서 토요일까지의 행복을 사는 설레임을 가져봤었습니다. 다만, 당첨번호와 맞추어보면서 그 허탈감이란....
갑자기 뭔가 허탈감도 있고 이렇게 안맞을 수도 있나 싶은 생각에 장난삼아 심심풀이로 GPT로 갈구어 로또 시뮬레이터를 만들어 보았습니다.

로또 번호를 다수(중복가능하게) 생성하고, 추첨 시뮬레이션 해보는 방식으로 개발을 해달라고 프롬프트를 작성했고,
몇번의 개갈굼 재가공이 있었습니다. 사용한 GPT 서비스는 perplexity 입니다.

 

주요 기능은 다음과 같습니다.

  • 로또 구매자 수 설정
  • 랜덤으로 로또 번호 생성(동일번호 생성가능)
  • 로또 추첨 시뮬레이션 - 당첨번호 요약 및 정리

 

프롬프트는 다음과 같이 작성했구요.

프롬프트 작성 및 피드백 스크린샷

장난삼아 만들어서 확률이나 수학적 공식을 적용한건지는 모르겠지만,
만들어진 스크립트로 여러번 당첨 시뮬레이션을 해보니.....
아주 여러번에도 불구하고 한자리 수의 확률로 5등이 나오는 것을 보고 납득이 되었습니다. 이렇게 한탕해먹기가 어려운건가

 

코드는 뭐 GPT로 만들었으니, 공유해봅니다.

import random
import os
from collections import Counter

class LottoRecommender:
    def __init__(self):
        self.title = "로또 번호 생성/추첨 시뮬레이터"
        self.buyers = 1
        self.lotto_numbers = []

    def clear_screen(self):
        os.system('cls' if os.name == 'nt' else 'clear')

    def generate_lotto_numbers(self):
        return sorted(random.sample(range(1, 46), 6))

    def set_buyers(self):
        self.clear_screen()
        print(f"{self.title}\n")
        try:
            self.buyers = int(input("로또 구매자 수를 입력하세요: "))
        except ValueError:
            print("올바른 숫자를 입력해주세요.")
        input("계속하려면 Enter를 누르세요...")

    def recommend_numbers(self):
        self.clear_screen()
        print(f"{self.title}\n")
        try:
            count = int(input("몇 개의 로또 번호 세트를 생성할까요? "))
        except ValueError:
            print("올바른 숫자를 입력해주세요.")
            input("계속하려면 Enter를 누르세요...")
            return

        self.lotto_numbers = []
        for _ in range(count):
            self.lotto_numbers.append(sorted(random.choices(range(1, 46), k=6)))

        print(f"\n생성된 로또 번호:")
        for i, numbers in enumerate(self.lotto_numbers, 1):
            print(f"세트 {i}: {numbers}")

        input("계속하려면 Enter를 누르세요...")

    def simulate_win(self):
        self.clear_screen()
        print(f"{self.title}\n")
        if not self.lotto_numbers:
            print("먼저 로또 번호를 생성해주세요.")
            input("계속하려면 Enter를 누르세요...")
            return

        winning_numbers = sorted(random.choices(range(1, 46), k=6))
        print(f"당첨 번호: {winning_numbers}")

        results = {1: [], 2: [], 3: [], 4: [], 5: [], 0: []}  # 0은 낙첨을 의미
        total_sets = len(self.lotto_numbers)
        winning_sets = 0

        for i, numbers in enumerate(self.lotto_numbers, 1):
            matches = len(set(numbers) & set(winning_numbers))
            if matches == 6:
                results[1].append(i)
                winning_sets += 1
            elif matches == 5:
                results[3].append(i)
                winning_sets += 1
            elif matches == 4:
                results[4].append(i)
                winning_sets += 1
            elif matches == 3:
                results[5].append(i)
                winning_sets += 1
            else:
                results[0].append(i)

        win_rate = (winning_sets / total_sets) * 100

        print(f"\n총 {total_sets}개 중 {winning_sets}개 당첨 (당첨률: {win_rate:.2f}%)")

        for rank, sets in sorted(results.items(), reverse=True):
            if sets:
                if rank == 0:
                    print(f"\n낙첨: {len(sets)}개")
                else:
                    print(f"\n{rank}등: {len(sets)}개")
                    print(f"당첨 세트 번호: {sets}")
                    for set_num in sets:
                        print(f"세트 {set_num}: {self.lotto_numbers[set_num-1]}")

        input("\n계속하려면 Enter를 누르세요...")

    def display_menu(self):
        self.clear_screen()
        print(f"{self.title}\n")
        print("1. 로또 구매자 수 설정")
        print("2. 로또 번호 생성")
        print("3. 로또 추첨 시뮬레이션")
        print("Q. 나가기")
        print(f"\n구매자 수: {self.buyers}")
        print(f"로또 번호 세트 수: {len(self.lotto_numbers)}")

    def run(self):
        while True:
            self.display_menu()
            choice = input("\n메뉴를 선택하세요: ").lower()
            
            if choice == '1':
                self.set_buyers()
            elif choice == '2':
                self.recommend_numbers()
            elif choice == '3':
                self.simulate_win()
            elif choice == 'q':
                break

def main():
    recommender = LottoRecommender()
    recommender.run()

if __name__ == "__main__":
    main()

 

pyinstaller 로 생성한 실행파일도 첨부해봅니다.

lotto_simmulator.zip
6.76MB

 

블로그 포스팅하려고 더 돌려보니 개선사항이 보이네요.
로또 구매자 수를 발행 수로 바꾸고, 총 당첨금도 추가해서 실수령 액도 조회하게끔 해봐야겠어요.

오늘은 좀 늦어서, 다음 포스팅에 뵙겠습니다.