파이썬 로또번호 중복 - paisseon lottobeonho jungbog

파이썬 로또번호 중복 - paisseon lottobeonho jungbog
로또사진 - 픽사베이

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

알아야 할 것

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가 번호를 주었다. 그래도 맞추기 어려운 게 로또입니다. 너무 프로그램들에 맹신 안 하였으면 좋겠습니다.

<첫번째>

import random

print('로또번호 생성프로그램')

lotto=[]

while len(lotto)<6:
    lotto.append(random.randrange(1,46))

#중복된 숫자가 있는지 파악
    for i in range(len(lotto)):   
        for j in range(i):
            if lotto[i]==lotto[j]:
                lotto.pop()

continue

#추출된 숫자 정렬
lotto.sort()
print(lotto)

======================================

while문안에서 랜덤으로 숫자 추출 후 중복검사를 위해 중첩for문을 사용

lotto.pop() : 중복 숫자가 발생되면 pop()을 이용하여 제거

lotto.sort() : 추출된 6개의 숫자들을 정렬

<두번째>

import random

print('로또번호 생성프로그램')

lotto=set()
lotto_list=[]

while len(lotto)<6:
    lotto.add(random.randrange(1,46))

lotto_list=list(lotto)
lotto_list.sort()

print(lotto_list)

======================================

set(집합자료형)의 특징 중 하나인 중복을 허용하지 않는 점을 이용하여 소스를 간단하게 만듦.

set은 순서가 없기 때문에 리스트형으로 변환한 후 정렬하여 출력

파이썬 로또번호 중복 - paisseon lottobeonho jungbog

import random # 랜덤모듈 임포트

def get_random_number():
    number = random.randint(1, 45)
    return number #  1~45 난수를뽑아 number에 반환하는 함수 생성.

lotto_num = [] # 표준출력 오름차순으로 구하려면 리스트 sort사용.

while True: # 조건3: 중복이 나올 수 있으니 6개 뽑기보단 무한루프로 일단 돌리기
    random_num = get_random_number() # random_num에 반환된 num 저장
    if random_num not in lotto_num: # 그 반환된 num이 리스트에 없다면?
        lotto_num.append(random_num) # 리스트에 넣기!
    if len(lotto_num) == 6: # 리스트 길이가 6이되면 반복문 탈출
        break

lotto_num.sort() # 오름차순 정렬

print(lotto_num)

생각보다 많이 어려웠다.

처음에는 for문으로 여섯번 돌리면 껌이라고 생각했는데

중복되지않게 하려니 not in 연산을 오랜만에 사용하게 돼따.

1~45 의 난수를 뽑아서

중복되지 않으면 빈 리스트에 계속 append해서

결국 리스트 길이가 6이 되어버리면 무한루프 탈출!

뽑은 리스트는 오름차순 정렬하고 출력하면

중복없는 로또번호생성기 완성 ㅎ.ㅎ

.

파이썬 문법을 복습하다 함수부분에서 나온 예제이다.

굳이 random_num에 함수를 사용하여 난수를 집어넣지 않더라고

random_num = random.randint(1, 45)로도 사용이 가능할거같은데

선언 한번하면 재사용이 편리해지니 함수로 구현한거 같다.

.

이 생성기로 번호 열개 뽑아서 휴대폰에 저장해뒀다.

나한텐 의미가 조금이라도 있는 열가지 리스트니까

소고기 사묵게 4등만이라도 걸렸으면 좋겠다 ㅋㅋ!