본문 바로가기
Python

로또 번호 생성기 & ChatGPT

by 아짱이아빠 2023. 1. 7. 22:31
반응형

이번에는 로또 번호 6자리 조합을 찾는 파이썬 코드에 대해 알아보겠다.

이는 이전 포스트에서 다뤘던 딥러닝을 통한 로또 번호 추출과 같은 연장선상에 있다.

 

딥러닝을 통해 다음 차수의 1등 로또 번호들의 합을 예측한다.

이후 과거 로또 번호를 가장 많이 나온 순서 또는 가장 적게 나온 순서로 정렬하고 가장 많이 나온 번호들에서 예측된 합을 만족하는 번호의 조합을 만들거나 가장 적게 나온 번호들에서 예측된 합을 만족하는 번호의 조합을 찾는 것이다.

이에 대한 내용은 아래의 링크에 나와있다.

 

 

파이썬 딥러닝을 이용하여 로또 번호 예측하기 - 1부

이번에는 2부에 걸쳐 딥러닝 중 하나인 LSTM을 이용하여 로또 번호를 예측해보는 파이썬 코드에 대해 알아보겠다. 이전의 포스트에서 과거 1등 로또 번호들의 합을 바탕으로 기계학습을 하여 다

superhky.tistory.com

 

 

파이썬 딥러닝을 이용하여 로또 번호 예측하기 - 2부

지난 1부에서는 파이썬 딥러닝 중 하나인 LSTM을 통해 로또 번호 중 1개 자리에 대해서 예측해 보는 프로그램을 만들어 보았다. 2부에서는 로또 사이트에서 지난 1회 차부터 최근 회차까지의 1등

superhky.tistory.com

그러나 예전에는 6자리 번호의 조합을 찾는 코드를 완성하지 못했다.

최근 조금 시간이 나서 다시 한번 도전해서 코드를 만들어 보았고 또한 최근 알게된 ChatGPT를 이용해서도 코드를 만들어 비교를 결과를 비교해 보았다.

 

먼저 내가 만든 코드는 다음과 같다.

most_f = []
pre_sum=int(input("숫자를 입력하세요 :"))
most_sum=0
i=0
t=0

while True:
  for i in range(len(most)):
    most_b = most[i]
    most_sum = most_sum+most_b
    most_f.append(most_b)

    if len(most_f) == 1 :
      if most_sum >= pre_sum or most_f.count(0) == True:
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum and pre_sum-most_sum <= 15 :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum :
        pass 

    if len(most_f) == 2 :
      if len(most_f) != len(set(most_f)) :
        most_f.remove(most_b)
        most_sum = most_sum-most_b       
      elif most_sum >= pre_sum :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum and pre_sum-most_sum < 10 :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum :
        pass   

    if len(most_f) == 3:
      if len(most_f) != len(set(most_f)) :
        most_f.remove(most_b)
        most_sum = most_sum-most_b       
      elif most_sum >= pre_sum :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum and pre_sum-most_sum < 6:
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum :
        pass

    if len(most_f) == 4:
      if len(most_f) != len(set(most_f)) :
        most_f.remove(most_b)
        most_sum = most_sum-most_b      
      elif most_sum >= pre_sum :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum and pre_sum-most_sum < 3:
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum :
        pass

    if len(most_f) == 5:
      if len(most_f) != len(set(most_f)) :
        most_f.remove(most_b)
        most_sum = most_sum-most_b      
      elif most_sum >= pre_sum :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum :
        pass

    if len(most_f) == 6:
      if len(most_f) != len(set(most_f)) :
        most_f.remove(most_b)
        most_sum = most_sum-most_b             
      if most_sum > pre_sum :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum < pre_sum :
        most_f.remove(most_b)
        most_sum = most_sum-most_b
      elif most_sum == pre_sum :
        break

  if sum(most_f) == pre_sum and len(most_f) == 6 :
    break

  elif 1< len(most_f) <6 and len(most_f) > 6 :
   t = most.index(most_f[-1])
   most_f.remove(most_f[-1])

  if t == len(most)-1:
     most_f.append(most[0])
   else:
     most_f.append(most[t+1])

 

먼저 여섯 자리 번호 조합을 넣을 변수 “most_f”를 정의하고 예측된 합을 입력받도록 한다.

이후 ‘while’문을 통해 번호의 조합을 찾는다.

여기서 ‘most’는 과거 로또 번호 중 많이 나온 순서데로 정령된 데이터이다.

즉, ‘most’에 있는 첫 번째 숫자는 역대 로또 번호 중 가장 많이 나온 숫자이며 이 숫자를 시작으로 하나씩 그 다음의 숫자를 가져다가 합을 하고 예측된 합과의 비교를 한다.

아직 6자리가 다 채워지지 않았는데 예측된 합을 넘게되면 마지막으로 더해진 숫자를 다시 빼고 그 다음 순번의 숫자를 대입한다.

마찬가지로 6자리가 되었는데 예측된 합 보다 작으면 역시 마지막으로 더한 숫자를 빼고 다음 순번의 숫자를 대입해보는 방식이다.

이외에도 첫 숫자가 적용되었을 때에 예측 합과 첫 적용된 숫자간의 차가 15보다 작으면 즉, 최소로 채워질 수 있는 5개의 숫자가 1,2,3,4,5 보다 작아질 수 없기 때문에 첫 자리 숫자를 다시 정하는 조건, 동일한 숫자가 두 개 이상 포함되지 않도록 하는 조건등도 포함되어 있다.

 

아무튼 이런 여러 조건을 고민고민해서 코드를 만들었고 어느 정도 동작하는 것은 확인하였다.

그러던 중 인공지능이 코드를 만들어준다는 얘기를 듣고 이를 적용해 보았다.

이름은 ChatGPT이며 Google에서 탐색하면 해당 사이트에 들어갈 수 있다.

회원가입을 하고 지금은 무료로 사용할 수 있는데 언제 유료화로 전향할지는 모르겠다.

 

이 ChatGPT를 경험하고 이제 사람이 코딩하는 시대는 곧 끝날거라는 생각이 들었다.

ChatGPT의 방식은 채팅을 하듯이 내가 원하는 내용을(가능하면 영어로) 입력하면 빠르게 AI가 대답을 해주는 방식이다.

다양한 프로그래밍 언어로 코딩을 해주기도 하고 내가 만든 코드의 오류를 찾아주기도 하며 이 뿐만 아니라 장문의 글을 요약해주기도 하고 특정 주제로 소설을 써주기도 한다.

다만 중요한 것은 명확하게 원하는 것을 전달하는 것이다.

한 예로, 코딩 중 단순하지만 오류의 원인을 잘 찾지 못하고 있을 때 오류의 원인을 다음처럼 ChatGPT를 이용하여 찾을 수 있었다.

ChatGPT를 이용한 코드 오류 질문에 대한 AI의 답변
(ChatGPT를 이용한 코드 오류 질문에 대한 AI의 답변)

‘most_f’란 변수의 형식은 list인데 계속 ‘DataFrame’ object is not collable 이란  에러가 발생했다.

그래서 ChatGPT에 질문을 하고 나온 대답이 위의 그림과 같다.

 ‘sum’이란 변수가 중복적으로 사용되고 있을 수 있으니 다른 이름으로 정의를 하던지 코드를 다음과 같이 수정하라는 내용이다.

실제로 Google Colab을 사용하면서 앞부분의 다른 프로그램에서 ‘sum’을 사용하고 있어서 발생한 오류였다.

프로그램 내용을 모두 복사해서 질문하지 않아도 질문이 명확하게 AI에 전달되면 코드의 일부만 보고도 오류 예측을 정확히 한다.

 

이 ChatGPT를 이용하면 앞에서 내가 만든 코드와는 다르게 어떤 코드가 나올지 궁금하여 사용해 보았으며 ChatGPT가 만든 6개의 번호를 조합하는 코드는 다음과 같다.

def find_combination(numbers, target_sum):
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)):
            for k in range(j+1, len(numbers)):
                for l in range(k+1, len(numbers)):
                    for m in range(l+1, len(numbers)):
                        for n in range(m+1, len(numbers)):
                            if numbers[i] + numbers[j] + numbers[k] + numbers[l] + numbers[m] + numbers[n] == target_sum:
                                # Return the combination of numbers that adds up to the target sum
                                return [numbers[i], numbers[j], numbers[k], numbers[l], numbers[m], numbers[n]]
    # If no combination of numbers was found, return an empty list
    return []

# Get the target sum from the user
target_sum = int(input("Enter the target sum: "))

# Generate a list of numbers from 1 to 45
numbers = most

# Find a combination of numbers that adds up to the target sum
combination = find_combination(numbers, target_sum)

# Print the combination of numbers, or a message if no combination was found
if combination:
    print(combination)
else:
    print("No combination of numbers was found that adds up to the target sum.")

 

사실 이 결과를 보고 충격을 받았다.

나는 코드를 만드는데 고민도 많이 하고 시간도 많이 걸렸으며 코드도 길어졌는데 ChatGPT는 매우 간결하게 주석도 추가하여 제공해주었다.

물론 프로그래밍 전공도 아니고 제대로 배운적이 없어 프로그래밍 실력이 형편없으니 지극히 개인적인 생각일 수는 있으나 그래도 나는 왜 ChatGPT가 만든 방식으로 생각하지 못했었는지 그리고 AI는 어떻게 이렇게 간결하게 짤수 있었는지 어처구니가 없으면서 허탈하기도 했다.

 

반응형

 

실제로 결과를 비교해보면 ChatGPT의 결과가 더욱 정확했다.

로또 1048회차까지 가장 많이 나온 순으로 번호를 정렬하고 이 번호 순을 가지고 내가 만든 코드와 ChatGPT가 만든 코드의 결과를 비교해보면 대부분은 동일한 결과였으나, 조합하려는 수들의 합이 100보다 작은 경우에 서로 다른 결과가 나왔다.

예를 들면 예측 합이 60이라고 할 때에 내가 만든 코드의 결과는 13,1, 2, 21, 5, 18 이지만 ChatGPT 코드의 결과는 34, 12, 1, 2, 4, 7 이었다.

다음의 그림에서 파란색은 내가 만든 코드의 결과이고 빨간색은 ChatGPT 코드의 결과이다.

로또번호 생성 결과
(로또번호 생성 결과)

 

ChatGPT 코드의 결과가 원칙에 맞게 많이 나온 숫자의 순으로 조합했다는 것을 알 수 있다.

또한 특정 숫자의 합을 입력했을 때 내가 만든 코드로는 조합을 찾지못하거나 오래 걸리는 경우가 있었는데 ChatGPT의 코드는 그렇지 않고 정확하게 결과가 나왔다.

 

앞에서 얘기한 것 처럼 ChatGPT를 접하고 나서 앞으로 사람이 코딩하는 시대는 끝나가고 있다는 생각이 들었다.

GhatGPT를 사용하면서 마치 영화 '아이언맨'에서 토니 스타크가 그의 AI 비서인 자비스에게 명령해서 무언가를 만드는 것과 같은 느낌이었다.

처음 원하는 것을 시키고 결과가 마음에 들지 않으면 다음은 무엇이 마음에 안들어서 어떻게 고치고 싶은지를 입력하면 그게 맞게 계속해서 수정된 결과를 얻을 수 있다.

 

비록 시간을 많이 들여 만든 코드가 AI에 의해 1분도 채안되어 만들어진 코드보다 못했지만 앞으로 유료화되기 전까지 이 ChatGPT를 통해 여러 가지를 재밌는 것을 해볼 수 있을 것  같다.

반응형

댓글