컴퓨터/Python

Python (4) - 로또를 만들어보자

달서비 2021. 7. 17. 01:12

로또사진 - 픽사베이

알고리즘 테스트를 할 때 가장 기본적으로 나오는 부분이 로또입니다. 적당히 난이도 있으면서 만들기 쉬운 프로그램이 로또입니다. 이번에는 간단한 로또 프로그램을 한번 만들어보겠습니다

 

알아야 할 것

random 모듈 : 파이썬에서 랜덤 뽑기등에서 사용하는 메소드다
random.random() 0~1의 임의의 난수를 호출한다
random.randrange(1,11) 1이상 11미만의 정수를 뽑는다
random.choice(obj) obj에 있는 값을 랜덤으로 뽑는다

우선 로또라서 임의의 값을 호출하는 방법으로 random 모듈을 활용하려고 합니다. 해당 모듈을 이용하여 

 

소스코드 및 분석

다른 언어들은 배열을 비교하는 방식으로 중복 방지합니다. 파이썬에서는 set()라는 자료형이 있기 때문에 특성을 이용하여 중복 부분에 대하여 간단하게 처리하는 방법이 있습니다. 이 방법에 대한 소스코드와 로또가 추출되는 원리를 그대로 이용한 방법 두 가지를 공유하려고 합니다. 

 

1. 파이썬 set() 자료형을 이용하여 중복 방지를 한 소스코드

import random

# 1,45의 값을 랜덤으로 만들어주는 메소드
def makeNumber():
    num = random.randrange(1,46)
    return num

# 로또의 중복을 검사해주는 메소드
def lottoCheck(numArray):
    num = numArray
    numSet = list(set(numArray)) #set자료형은 중복을 허락하지 않는다
    if len(num) != len(numSet): #중복값과 중복제거값이 다른경우 다시 true를 호출한다.
        return 1
    else:
        return 0

lottonum = []
while len(lottonum) < 6:
    temp_num = makeNumber()
    lottonum.append(temp_num)
    if lottoCheck(lottonum): #검사후 다르면 다시 뽑고 같은 과정을 거친다
        lottonum.remove(temp_num)

lottonum.sort()
print(lottonum)

set자료형은 중복을 허락하지 않는 연산자라서 자료형을 바꾸는 것으로 중복을 제거할 수 있습니다. 

 

2. 로또번호를 뽑는 원리를 그대로 이용한 방법

import random

lottoBall = []

# 1~45 사이의 공을 생성한다.
def buildBall():
    global lottoBall
    lottoBall.clear()
    for i in range(1,46):
        lottoBall.append(i)

# 공을 뽑고 정렬한다.
def choiceball():
    global lottoBall
    result = []
    for i in range(0,6): #공을 뽑아 결과값에 해당값을 추가하고, 빠져나온공은 제외한다
        num = random.choice(lottoBall)
        result.append(num)
        lottoBall.remove(num)
    result.sort()
    return result

buildBall()
print(choiceball())

현실 로또에는 중복을 검사할 필요가 없습니다. 공을 뽑으면 같은 번호의 공은 다시 안 나옵니다. 그렇기에 뽑고 해당 공을 제거하는 과정을 가지면 됩니다. 하지만2번 방법에는 결정적인 단점이 있습니다. 메모리 부분에서 많은 낭비가 발생합니다. 

 

마지막으로

참고로 로또는 각각의 확률이 독립시행의 확률이기 때문에 인터넷에서 흔히 나오는 로또 예측 방식이나 그런 것들을 본다 해도 확률은 같습니다. 일반적인 원리에서는 조작할 수 없기 때문이죠. 그래서 AI가 번호를 주었다. 그래도 맞추기 어려운 게 로또입니다. 너무 프로그램들에 맹신 안 하였으면 좋겠습니다.