ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python과 VBA를 이용한 로또번호추천앱
    코딩 2026. 8. 12. 11:51
    728x90

    그간 로또번호생성기를 만들어서 잘 사용했는데 로또 사이트가 개편되면서 기존의 방식이 안먹게 됐다.

     

    Python/통계에 따른 로또 번호 생성기

    통계에 의한 로또번호 생성기방식아래 주소를 방문하면 번호별로 당첨된 횟수를 조회할 수 있다.https://dhlottery.co.kr/gameResult.do?method=statByNumber여기서 찾은 자료를 바탕으로 숫자풀을 만든다.숫자*

    summertrees.tistory.com

    그래서 프로그램을 수정했다.

    기존엔 requests와 bs4만으로도 기존번호 당첨횟수를 쉽게 가져올 수 있었는데 이젠 이 라이브러리로 가져올 수가 없다.

    번호를 가져오기 위해 브라우저를 컨트롤해야 하는데 이 간단한 앱을 굳이 그렇게 해야 하느냐하는 생각에 그냥 사이트에서 번호화 횟수를 복사하고 엑셀에 붙여넣은 다음 엑셀의 VBA로 데이터를 정리하고 CSV로 저장한 뒤, 파이썬으로 번호를 추천하도록 바꿨다.

    엑셀에서 기존 추첨횟수를 CSV로 저장

    사이트에서 값을 복사해서 붙여넣으면 아래처럼 번호와 당첨횟수가 번갈아 저장된다.

    원본 데이터
    1
    123회
    2
    125회
    3
    111회

    이 데이터를 다음과 같이 번호당첨횟수 두 열로 정리한 뒤 CSV 파일로 저장하는 VBA 코드를 만들었다.

    번호 당첨횟수
    1 123
    2 125
    3 111

    전체 코드

    Option Explicit
    Option Base 1
    
    Function VariantArrayToTwoColumns(ByVal anArray As Variant) As Variant
        Dim outputArray() As Variant
        Dim i As Integer, rowCount As Integer
    
        ' Count Rows
        rowCount = (UBound(anArray) - LBound(anArray) + 2) \ 2
    
        ' Create Nx2 Array
        ReDim outputArray(1 To rowCount, 1 To 2)
    
        For i = LBound(anArray, 1) To UBound(anArray, 1)
            outputArray((i - LBound(anArray, 1)) \ 2 + 1, _
                        (i - LBound(anArray, 1)) Mod 2 + 1) = anArray(i, 1)
        Next i
    
        VariantArrayToTwoColumns = Array(outputArray, rowCount)
    End Function
    
    Sub main()
        '모든 셀에서 "회" 문자 제거
        Cells.Replace What:="회", Replacement:=""
    
        'C1부터 아래쪽 데이터 범위 찾기
        Dim startCell As Range, endCell As Range
        Set startCell = Range("C1")
        Set endCell = startCell.End(xlDown)
    
        '셀 범위를 배열로 가져오기
        Dim dataSet As Variant, result As Variant
        dataSet = Range(startCell, endCell).Value
    
        '데이터를 2열 배열로 변환
        Dim rowCount As Integer
        Dim resultArray As Variant
        result = VariantArrayToTwoColumns(dataSet)
        resultArray = result(1)
        rowCount = result(2)
    
        '현재 시트 뒤에 새 시트 추가
        Sheets.Add After:=ActiveSheet
    
        '새 시트에 헤더와 데이터 입력
        Dim ws As Worksheet
        Set ws = ActiveSheet
        ws.Range("A1").Value = "번호"
        ws.Range("B1").Value = "당첨횟수"
        ws.Range("A2").Resize(rowCount, 2).Value = resultArray
    
        'CSV 파일로 저장
        Dim savePath As String, wb As Workbook
        Set wb = ThisWorkbook
        savePath = "Your Path & File Name"
    
        Application.DisplayAlerts = False
        wb.SaveAs _
            Filename:=savePath, _
            FileFormat:=xlCSVUTF8, _
            Local:=True
        Application.DisplayAlerts = True
    End Sub

    코드의 전체 동작 과정

    이 코드는 다음 순서로 실행된다.

    1. 워크시트의 데이터에서 문자를 제거한다.
    2. C1 셀부터 연속된 데이터의 마지막 셀까지 읽는다.
    3. 한 열로 된 데이터를 2열짜리 배열로 재배열한다.
    4. 현재 시트 뒤에 새 워크시트를 추가한다.
    5. A열과 B열에 번호, 당첨횟수 헤더와 데이터를 기록한다.
    6. 결과가 들어 있는 워크북을 UTF-8 CSV 형식으로 저장한다.

    파이썬에서 CSV를 가져오고 번호를 추천

    로또 번호 추천 프로그램을 만드는 방법은 다양하다. 과거에 자주 당첨된 번호일수록 더 높은 확률로 선택되도록 가중치가 적용된 숫자 풀을 만들고, 이 풀에서 중복되지 않는 6개 번호를 뽑는 파이썬 코드를 만들었다.

    이 프로그램의 전체 흐름은 다음과 같다.

    1. CSV 파일에서 번호별 당첨 횟수를 읽는다.
    2. 당첨 횟수만큼 각 번호를 반복하여 숫자 풀을 만든다.
    3. 숫자 풀에서 중복되지 않는 번호 6개를 선택한다.
    4. 이 과정을 10번 반복하여 10개의 조합을 출력한다.

    전체 코드

    import pandas as pd
    import random
    
    def csv_to_dataframe(file_path):
        df = pd.read_csv(
            file_path,
            index_col=False,
            encoding="utf-8-sig"
        )
        return df
    
    def get_numbers_pool(numbers, frequencies):
        # 각 번호를 당첨 횟수만큼 반복하여 숫자 풀 생성
        numbers_pool = []
    
        for num, freq in zip(numbers, frequencies):
            numbers_pool.extend([num] * freq)
    
        return numbers_pool
    
    def get_lottery(numbers_pool):
        lottery = []
    
        while len(lottery) < 6:
            # 숫자 풀을 섞은 후 첫 번째 숫자 선택
            random.shuffle(numbers_pool)
            number = numbers_pool[0]
    
            # 이미 뽑은 번호가 아니면 조합에 추가
            if number not in lottery:
                lottery.append(number)
    
        return sorted(lottery)
    
    def main():
        # CSV 파일에서 번호별 당첨 통계 읽기
        df = csv_to_dataframe(file_path=PATH_LOTTERY)
    
        numbers = df["번호"].tolist()
        frequencies = df["당첨횟수"].tolist()
    
        # 당첨 빈도가 반영된 숫자 풀 생성
        numbers_pool = get_numbers_pool(numbers, frequencies)
    
        # 10개의 로또 조합 생성
        for i in range(10):
            lottery = get_lottery(numbers_pool)
            print(f"조합 {i + 1}: {lottery}")
    
    # 로또 번호 빈도 CSV 파일 경로
    PATH_LOTTERY = (
        "Your Path"
    )
    
    if __name__ == "__main__":
        main()

    실행결과는 아래와 같다.

    조합 1: [7, 12, 25, 31, 41, 42]
    조합 2: [1, 6, 9, 16, 18, 35]
    조합 3: [6, 7, 25, 29, 33, 45]
    조합 4: [8, 17, 22, 27, 28, 35]
    조합 5: [4, 16, 17, 18, 19, 39]
    조합 6: [4, 22, 27, 30, 33, 38]
    조합 7: [11, 18, 20, 28, 33, 38]
    조합 8: [16, 31, 35, 36, 38, 44]
    조합 9: [2, 12, 25, 31, 36, 43]
    조합 10: [10, 14, 16, 20, 31, 43]

     

    728x90

    댓글

Designed by Tistory.