-
Python과 VBA를 이용한 로또번호추천앱코딩 2026. 8. 12. 11:51728x90
그간 로또번호생성기를 만들어서 잘 사용했는데 로또 사이트가 개편되면서 기존의 방식이 안먹게 됐다.
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코드의 전체 동작 과정
이 코드는 다음 순서로 실행된다.
- 워크시트의 데이터에서
회문자를 제거한다. - C1 셀부터 연속된 데이터의 마지막 셀까지 읽는다.
- 한 열로 된 데이터를 2열짜리 배열로 재배열한다.
- 현재 시트 뒤에 새 워크시트를 추가한다.
- A열과 B열에
번호,당첨횟수헤더와 데이터를 기록한다. - 결과가 들어 있는 워크북을 UTF-8 CSV 형식으로 저장한다.
파이썬에서 CSV를 가져오고 번호를 추천
로또 번호 추천 프로그램을 만드는 방법은 다양하다. 과거에 자주 당첨된 번호일수록 더 높은 확률로 선택되도록 가중치가 적용된 숫자 풀을 만들고, 이 풀에서 중복되지 않는 6개 번호를 뽑는 파이썬 코드를 만들었다.
이 프로그램의 전체 흐름은 다음과 같다.
- CSV 파일에서 번호별 당첨 횟수를 읽는다.
- 당첨 횟수만큼 각 번호를 반복하여 숫자 풀을 만든다.
- 숫자 풀에서 중복되지 않는 번호 6개를 선택한다.
- 이 과정을 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'코딩' 카테고리의 다른 글
마우스 오른쪽 버튼 사용 금지가 설정된 블로그에서 오른쪽 버튼 사용하기 (0) 2024.08.11 ExifTool/사진과 동영상의 Exif 정보 처리 (0) 2024.01.23 [Markdown] 마크다운 정리 (1) 2022.12.20 FFMEPG (0) 2022.12.19 - 워크시트의 데이터에서