[PYTHON] 로또시뮬레이션

2020. 12. 27. 18:14IT/PYTHON

로또 시뮬레이션 프로그램을 만들어 보겠습니다. 

이 프로그램은 과정이 많기 때문에, 여러 파트로 나눠서 문제를 해결해 나갈 건데요. 

먼저 이 레슨에서 프로그램 전체에 대한 설명을 한 번 하고 가겠습니다. 

규칙 

로또는 주 1회씩 열립니다. 하지만 한 사람이 한 회차에 여러 번 참여할 수도 있습니다. 

번호는 1부터 45까지 있는데요. 주최측에서는 매주 6개의 '일반 당첨 번호'와 1개의 '보너스 번호'를 뽑습니다. 그리고 참가자는 1번 참여할 때마다 서로 다른 번호 6개를 선택합니다. 

당첨 액수는 아래 규칙에 따라 결정됩니다. 

1. 내가 뽑은 번호 6개와 일반 당첨 번호 6개 모두 일치 (10억 원) 
2. 내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치, 그리고 내 번호 1개와 보너스 번호 일치 (5천만 원) 
3. 내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치 (100만 원) 
4. 내가 뽑은 번호 4개와 일반 당첨 번호 4개 일치 (5만 원) 
5. 내가 뽑은 번호 3개와 일반 당첨 번호 3개 일치 (5천 원) 

 

과제 설명 

여러분의 임무는 로또 시뮬레이션을 위한 함수들을 작성하는 것입니다. 어떤 함수들이 있는지 봅시다. 

generate_numbers

이 함수는 파라미터로 정수 n을 받습니다. 무작위로 1과 45 사이의 서로 다른 번호 n개를 뽑고, 그 번호들이 담긴 리스트를 리턴합니다. 예를 들어서 아래 코드를 실행하면,

print(generate_numbers(6))

이런 결과가 나올 수 있습니다.

하지만 다시 실행하면 다른 결과가 나오겠죠? 

참고로 이 함수는 참가자의 번호를 뽑는 데에도 쓰이고, 보너스를 포함한 당첨 번호 7개를 뽑는 데에도 쓰입니다. 

# 내 답안
from random import randint

def generate_numbers(n):
    # 코드를 작성하세요.
    list = []
    i = 0
    
    while i < n:
        rand_num = randint(1,45)
        
        dup = False
        
        # 리스트에 있는 숫자가 나오면 다시 랜덤 돌림
        for num in list:
            if num == rand_num:
                dup = True
        
        if dup == False:
            list.append(rand_num)
            i += 1
    return list

print(generate_numbers(6))


# 모범 답안
from random import randint


def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        num = randint(1, 45)
        if num not in numbers:
            numbers.append(num)

    return numbers

# 예시 결과 출력
print(generate_numbers(6))

 

draw_winning_numbers 

일반 당첨 번호 6개와 보너스 번호 1개가 포함된 리스트를 리턴합니다. 일반 당첨 번호 6개는 정렬되어 있어야 하고, 보너스 번호는 마지막에 추가하면 됩니다. 예를 들어서 아래 코드를 실행하면,

print(draw_winning_numbers())

이런 결과가 나올 수 있습니다.

앞서 정의한 generate_numbers 함수를 잘 활용하면, 함수를 간결하게 작성할 수 있습니다. 

# 내 답안
from random import randint


def generate_numbers(n):
    # 지난 과제의 코드를 붙여 넣으세요.
    list = []
    i = 0
    
    while i < n:
        rand_num = randint(1,45)
        
        dup = False
        
        # 리스트에 있는 숫자가 나오면 다시 랜덤 돌림
        for num in list:
            if num == rand_num:
                dup = True
        
        if dup == False:
            list.append(rand_num)
            i += 1
    return list

def draw_winning_numbers():
    # 코드를 작성하세요.
    winning_numbers = generate_numbers(6)
    winning_numbers = sorted(winning_numbers)
    
    while len(winning_numbers) < 7: 
        num = randint(1, 45) 
        if num not in winning_numbers: 
            winning_numbers.append(num)

    return winning_numbers

print(draw_winning_numbers())


# 모범 답안
from random import randint


def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        new_number = randint(1, 45)
        if new_number not in numbers:
            numbers.append(new_number)

    return numbers


def draw_winning_numbers():
    winning_numbers = generate_numbers(7)
    return sorted(winning_numbers[:6]) + winning_numbers[6:]

count_matching_numbers 

파라미터로 리스트 list_1과 리스트 list_2를 받고, 두 리스트 사이에 겹치는 번호 개수를 리턴합니다. 

예를 들어서 아래 코드를 실행하면,

print(count_matching_numbers([2, 7, 11, 14, 25, 40], [2, 11, 13, 14, 30, 35]))

2, 11, 13이 겹치기 때문에 이렇게 나옵니다. 

또 아래 코드를 실행하면,

print(count_matching_numbers([2, 7, 11, 14, 25, 40], [14]))

14가 겹치기 때문에 이렇게 나오겠죠?

# 내 답안
def count_matching_numbers(list_1, list_2):
    # 코드를 작성하세요.
    count = 0
    for num1 in list_1:
        for num2 in list_2:
            if num1 == num2:
                count += 1
    
    return count


# 테스트
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [2, 11, 13, 14, 30, 35]))
print(count_matching_numbers([2, 7, 11, 14, 25, 40], [14]))


# 모범답안
def count_matching_numbers(numbers, winning_numbers):
    count = 0

    for num in numbers:
        if num in winning_numbers:
            count = count + 1

    return count

check 

참가자의 당첨 금액을 리턴합니다. 파라미터로 참가자가 뽑은 번호가 담긴 리스트 numbers와 주최측에서 뽑은 번호가 담긴 리스트 winning_numbers를 받는데요. numbers는 당연히 번호 여섯 개를 담고 있고, winning_numbers는 보너스까지 해서 번호 7개를 담고 있겠죠? 

예를 들어서 아래 코드를 실행하면,

numbers_test = [2, 4, 11, 14, 25, 40]
winning_numbers_test = [4, 12, 14, 28, 40, 41, 6]

print(check(numbers_list, winning_numbers_test))

4, 14, 40... 이렇게 번호 3개가 겹치기 때문에 5천 원에 당첨됩니다.

# 내 답안
def count_matching_numbers(numbers, winning_numbers):
    # 지난 과제의 코드를 붙여 넣으세요.
    count = 0

    for num in numbers:
        if num in winning_numbers:
            count = count + 1

    return count


def check(numbers, winning_numbers):
    # 코드를 작성하세요.
    bonus_num = [0]
    bonus_num[0] = winning_numbers[6]
    general_numbers = [
        winning_numbers[0],
        winning_numbers[1],
        winning_numbers[2],
        winning_numbers[3],
        winning_numbers[4],
        winning_numbers[5]
        ]
    
    result1 = count_matching_numbers(numbers, general_numbers)
    result2 = count_matching_numbers(numbers, bonus_num)
    
    if result1 == 6:
        return 1000000000
    elif result1 == 5 and result2 == 1:
        return 50000000
    elif result1 == 5 and result2 == 0:
        return 1000000
    elif result1 == 4:
        return 50000
    elif result1 == 3:
        return 5000
    else:
        return 0

# 테스트
print(check([2, 4, 11, 14, 25, 40], [4, 12, 14, 28, 40, 41, 6]))
print(check([2, 4, 11, 14, 25, 40], [2, 4, 10, 11, 14, 40, 25]))


# 모범답안
from random import randint


def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        new_number = randint(1, 45)
        if new_number not in numbers:
            numbers.append(new_number)

    return numbers


def draw_winning_numbers():
    winning_numbers = generate_numbers(7)
    return sorted(winning_numbers[:6]) + winning_numbers[6:]


def count_matching_numbers(numbers, winning_numbers):
    count = 0

    for num in numbers:
        if num in winning_numbers:
            count = count + 1

    return count


def check(numbers, winning_numbers):
    count = count_matching_numbers(numbers, winning_numbers[:6])
    bonus_count = count_matching_numbers(numbers, winning_numbers[6:])

    if count == 6:
        return 1000000000
    elif count == 5 and bonus_count == 1:
        return 50000000
    elif count == 5:
        return 1000000
    elif count == 4:
        return 50000
    elif count == 3:
        return 5000
    else:
        return 0

 

통합본 : lottery.py

from random import randint


def generate_numbers(n):
    # 지난 과제의 코드를 붙여 넣으세요.
    list = []
    i = 0

    while i < n:
        rand_num = randint(1, 45)

        dup = False

        # 리스트에 있는 숫자가 나오면 다시 랜덤 돌림
        for num in list:
            if num == rand_num:
                dup = True

        if dup == False:
            list.append(rand_num)
            i += 1
    return list


def draw_winning_numbers():
    # 코드를 작성하세요.
    winning_numbers = generate_numbers(6)
    winning_numbers = sorted(winning_numbers)

    while len(winning_numbers) < 7:
        num = randint(1, 45)
        if num not in winning_numbers:
            winning_numbers.append(num)

    return winning_numbers


def count_matching_numbers(numbers, winning_numbers):
    # 지난 과제의 코드를 붙여 넣으세요.
    count = 0

    for num in numbers:
        if num in winning_numbers:
            count = count + 1

    return count


def check(numbers, winning_numbers):
    # 코드를 작성하세요.
    bonus_num = [0]
    bonus_num[0] = winning_numbers[6]
    general_numbers = [
        winning_numbers[0],
        winning_numbers[1],
        winning_numbers[2],
        winning_numbers[3],
        winning_numbers[4],
        winning_numbers[5]
    ]

    result1 = count_matching_numbers(numbers, general_numbers)
    result2 = count_matching_numbers(numbers, bonus_num)

    if result1 == 6:
        return 1000000000
    elif result1 == 5 and result2 == 1:
        return 50000000
    elif result1 == 5 and result2 == 0:
        return 1000000
    elif result1 == 4:
        return 50000
    elif result1 == 3:
        return 5000
    else:
        return 0

 

비주얼하게 웹페이지로 표시 : 아래 파일 다운로드하여 lottery.py 과 같은 폴더에 저장한 후, 실행시키면 아래와 같이 멋있게 나타난다.

lottery_driver.py
0.01MB