본문 바로가기

파이썬으로 로또 1등 도전기

8일차) 특정회차 제외수 설정해서 로또번호 추출하기

안녕하세요! 오늘은 여러분과 함께 로또 번호를 재미있게 생성하는 방법에 대해 이야기해볼까 합니다. **Python**을 활용하여 자동으로 로또 번호를 추첨해보도록 하겠습니다. 이 프로그램은 지난 로또 당첨 번호를 기반으로 특정 번호를 제외하고 새로운 번호를 생성하는 기능도 포함되어 있습니다!

## 🔍 기본 개념

로또는 매주 토요일에 진행되며, 번호는 1부터 45까지의 숫자 중에서 무작위로 선택됩니다. 하지만 우리가 원하는 번호를 만들기 위해 몇 가지 규칙을 설정할 수 있습니다. 예를 들어, 특정 번호를 제외하고 싶다면 그 번호는 우리의 로또 번호 리스트에서 제외해야겠죠?

이제 코드를 살펴보며 어떻게 구현했는지 알아보겠습니다!

## 📜 코드 설명

import requests
import random
from datetime import datetime

def get_latest_draw_no():
    # 로또 1회차 기준 날짜 (2002년 12월 7일)
    first_draw_date = datetime(2002, 12, 7)
    
    # 오늘 날짜
    today = datetime.today()
    
    # 첫 회차 기준으로 경과한 일 수 계산
    days_passed = (today - first_draw_date).days
    
    # 매주 토요일에 추첨 (7일에 한 번씩 진행되므로 7로 나눔)
    draw_no = (days_passed // 7) + 1
    
    return draw_no



위의 코드는 오늘 날짜 기준으로 최신 로또 회차 번호를 계산합니다. 로또는 2002년 12월 7일에 시작되었으니, 그 날짜를 기준으로 얼마나 많은 주가 지났는지를 계산하여 회차 번호를 정합니다.

### 🎲 로또 번호 가져오기

다음은 로또 당첨 번호를 가져오는 함수입니다.

def get_lotto_winning_numbers(draw_no):
    # 공공데이터포털 로또 API URL
    url = f"https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo={draw_no}"
    
    # API로부터 데이터 가져오기
    response = requests.get(url)
    data = response.json()
    
    if data["returnValue"] == "success":
        # 로또 번호 출력
        winning_numbers = [data[f"drwtNo{i}"] for i in range(1, 7)]
        bonus_number = data["bnusNo"]
        return winning_numbers, bonus_number
    else:
        return None, None



위 함수는 로또 API를 호출하여 지정된 회차의 당첨 번호와 보너스 번호를 가져옵니다. 만약 데이터가 정상적으로 불러와지면, 해당 번호들을 리스트로 반환합니다.

### 🚫 번호 제외하기

우리는 특정 번호를 제외해야 할 필요가 있습니다. 이를 위해 `get_excluded_numbers` 함수를 만듭니다.

def get_excluded_numbers(latest_draw_no, offset, exclude_indices, exclude_bonus):
    # 최신 회차 기준으로 offset 회차 전 번호 가져오기
    target_draw_no = latest_draw_no - offset
    target_numbers, target_bonus = get_lotto_winning_numbers(target_draw_no)

    if target_numbers:
        # 제외할 번호 설정
        excluded_numbers = [target_numbers[i] for i in exclude_indices]
        
        # 보너스 번호를 제외할지 여부 확인
        if exclude_bonus:
            excluded_numbers.append(target_bonus)
        
        return excluded_numbers, target_numbers, target_bonus
    else:
        return None, None, None



이 함수는 최신 회차를 기준으로 특정 번호를 제외하고, 보너스 번호를 포함할지 여부를 결정합니다.

### 🎉 로또 번호 생성하기

마지막으로, 로또 번호를 생성하는 함수를 살펴보겠습니다.

def generate_lotto_numbers(excluded_numbers):
    all_numbers = set(range(1, 46))  # 1부터 45까지의 숫자
    excluded_set = set(excluded_numbers)  # 제외할 번호 집합
    
    # 제외된 번호를 제거한 번호 집합
    available_numbers = list(all_numbers - excluded_set)
    
    # 무작위로 6개의 로또 번호 선택
    lotto_numbers = random.sample(available_numbers, 6)
    return lotto_numbers



이 함수는 1부터 45까지의 모든 숫자 중에서 제외된 번호를 뺀 후, 무작위로 6개의 번호를 선택합니다.

## 📊 전체 프로그램 실행

모든 함수가 준비되었으니 이제 전체 프로그램을 실행해봅시다. 아래 코드는 로또 번호를 추첨하고 결과를 출력합니다.

# 최신 회차 번호 계산
latest_draw_no = get_latest_draw_no()
print(f"오늘 날짜 기준 최신 로또 회차 번호는: {latest_draw_no}회차 입니다.")

# 제외할 번호 인덱스 설정 (첫 번째 숫자와 여섯 번째 숫자 제외)
exclude_indices = [0, 5]  # 0은 첫 번째, 5는 여섯 번째 번호
exclude_bonus = True  # 보너스 번호를 제외할지 여부

excluded_numbers, target_numbers, target_bonus = get_excluded_numbers(latest_draw_no, 2, exclude_indices, exclude_bonus)

if excluded_numbers:
    print(f"제외할 번호: {excluded_numbers}")
    print(f"{latest_draw_no - 2}회차: 당첨 번호: {target_numbers}, 보너스 번호: {target_bonus}")

    # 10개의 로또 번호 세트 추첨
    for i in range(10):
        lotto_numbers = generate_lotto_numbers(excluded_numbers)
        print(f"세트 {i + 1}의 당첨 번호: {lotto_numbers}")
else:
    print(f"{latest_draw_no - 2}회차의 데이터를 불러오지 못했습니다.")

 

### 전체소스

import requests
import random
from datetime import datetime

def get_latest_draw_no():
    # 로또 1회차 기준 날짜 (2002년 12월 7일)
    first_draw_date = datetime(2002, 12, 7)
    
    # 오늘 날짜
    today = datetime.today()
    
    # 첫 회차 기준으로 경과한 일 수 계산
    days_passed = (today - first_draw_date).days
    
    # 매주 토요일에 추첨 (7일에 한 번씩 진행되므로 7로 나눔)
    draw_no = (days_passed // 7) + 1
    
    return draw_no

def get_lotto_winning_numbers(draw_no):
    # 공공데이터포털 로또 API URL
    url = f"https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo={draw_no}"
    
    # API로부터 데이터 가져오기
    response = requests.get(url)
    data = response.json()
    
    if data["returnValue"] == "success":
        # 로또 번호 출력
        winning_numbers = [data[f"drwtNo{i}"] for i in range(1, 7)]
        bonus_number = data["bnusNo"]
        return winning_numbers, bonus_number
    else:
        return None, None

def get_excluded_numbers(latest_draw_no, offset, exclude_indices, exclude_bonus):
    # 최신 회차 기준으로 offset 회차 전 번호 가져오기
    target_draw_no = latest_draw_no - offset
    target_numbers, target_bonus = get_lotto_winning_numbers(target_draw_no)

    if target_numbers:
        # 제외할 번호 설정
        excluded_numbers = [target_numbers[i] for i in exclude_indices]
        
        # 보너스 번호를 제외할지 여부 확인
        if exclude_bonus:
            excluded_numbers.append(target_bonus)
        
        # 제외할 번호를 정렬
        excluded_numbers.sort()
        
        return excluded_numbers, target_numbers, target_bonus
    else:
        return None, None, None

def generate_lotto_numbers(excluded_numbers):
    all_numbers = set(range(1, 46))  # 1부터 45까지의 숫자
    excluded_set = set(excluded_numbers)  # 제외할 번호 집합
    
    # 제외된 번호를 제거한 번호 집합
    available_numbers = list(all_numbers - excluded_set)
    
    # 무작위로 6개의 로또 번호 선택
    lotto_numbers = random.sample(available_numbers, 6)
    
    # 선택된 번호를 정렬
    return sorted(lotto_numbers)

# 최신 회차 번호 계산
latest_draw_no = get_latest_draw_no()
print(f"오늘 날짜 기준 최신 로또 회차 번호는: {latest_draw_no}회차 입니다.")

# 제외할 번호 인덱스 설정 (첫 번째 숫자와 여섯 번째 숫자 제외)
exclude_indices = [0, 5]  # 0은 첫 번째, 5는 여섯 번째 번호
exclude_bonus = True  # 보너스 번호를 제외할지 여부

excluded_numbers, target_numbers, target_bonus = get_excluded_numbers(latest_draw_no, 2, exclude_indices, exclude_bonus)

if excluded_numbers:
    print(f"제외할 번호: {excluded_numbers}")  # 정렬된 제외 번호 출력
    print(f"{latest_draw_no - 2}회차: 당첨 번호: {target_numbers}, 보너스 번호: {target_bonus}")

    # 10개의 로또 번호 세트 추첨
    for i in range(10):
        lotto_numbers = generate_lotto_numbers(excluded_numbers)
        print(f"세트 {i + 1}의 당첨 번호: {lotto_numbers}")  # 정렬된 번호 출력
else:
    print(f"{latest_draw_no - 2}회차의 데이터를 불러오지 못했습니다.")

 

 

### 출력결과

오늘 날짜 기준 최신 로또 회차 번호는: 1141회차 입니다.
제외할 번호: [5, 40, 18]
1139회차: 당첨 번호: [5, 12, 15, 30, 37, 40], 보너스 번호: 18
세트 1의 당첨 번호: [9, 13, 2, 30, 33, 25]
세트 2의 당첨 번호: [42, 22, 17, 28, 24, 43]
세트 3의 당첨 번호: [27, 36, 22, 45, 37, 35]
세트 4의 당첨 번호: [25, 24, 28, 19, 45, 29]
세트 5의 당첨 번호: [1, 4, 6, 41, 28, 23]
세트 6의 당첨 번호: [7, 4, 25, 9, 20, 35]
세트 7의 당첨 번호: [10, 15, 44, 9, 34, 3]
세트 8의 당첨 번호: [38, 22, 16, 19, 44, 37]
세트 9의 당첨 번호: [16, 26, 7, 30, 43, 25]
세트 10의 당첨 번호: [14, 27, 38, 42, 15, 3]



### 결과
이 코드를 실행하면 최신 회차에 기반하여 제외된 번호를 고려한 10개의 로또 번호 세트를 얻을 수 있습니다. 매 세트마다 새로운 번호를 생성하여 무작위로 제공하므로, 여러분의 로또 꿈에 한 발짝 더 다가갈 수 있는 기회를 제공합니다!

이제 여러분도 직접 로또 번호를 생성해보세요! 행운을 빕니다! 🍀