Language/Python

Project : 로또 시뮬레이션

p3chaeyeon 2022. 8. 30. 21:29

 

규칙

로또는 주 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개를 뽑고, 그 번호들이 담긴 리스트 리턴

>> 참가자 번호 뽑을 때, 보너스를 포함한 당첨 번호 5개 뽑을 때 사용

 

draw_winning_numbers

일반 당첨 번호 6개, 보너스 번호 1개가 포함된 리스ㅡ 리턴

일반 당첨 번호 : 6개 정렬, 보너스 번호 : 마지막에 추가

 

count_matching_numbers

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

 

check

참가자의 당첨 금액 래턴

파라미터로 참가자가 뽑은 번호가 담긴 리스트 numbers와 주최측에서 뽑은 번호가 담긴 리스트 winning_numbers 받음

numbers : 번호 여섯 개 담고 있음

winning_numbers : 보너스까지 해서 7개 번호 담고 있음

 

 

from random import randint


def generate_numbers(n):
    numbers = [] # 빈 리스트 만들기

    while len(numbers) < n:
        num = randint(1, 45) # 번호 무작위로 뽑기
        if num not in numbers: # new_number가 numbers 리스트에 없는 경우에만 추가 ; 중복값 제외
            numbers.append(num) # new_number 추가

    return numbers

def draw_winning_numbers():
    winning_numbers = generate_numbers(7) # 우선 일반 번호 7개 뽑기
    return sorted(winning_numbers[:6]) + winning_numbers[6:] # 일반 당첨 번호인 첫 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 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):
	
    # 참가자 번호 6개와 일반 당첨 번호 6개 중 몇 개가 일치하는지
    count = count_matching_numbers(numbers, winning_numbers[:6])
    
    # 참가자 번호 6개와 보너스 번호 1개 중 몇 개가 일치하는지
    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

 

위 코드를 lotttery.py 라는 파일에 넣고 // 모듈로 활용

 

lottery.py 파일로 lottery.html 파일 생성

- lottery.py 와 lottery.driver.py 를 같은 폴더에 넣기

- 그리고 나서 lottery_driver.py 실행

 

# lottery_driver.py ; 코드잇 제공

import lottery

HEAD_HTML = '''
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>로또</title>

    <style type="text/css" media="screen">
        body {
            background-color: #FAFAFA;
            padding-top: 80px;
        }

        .navbar {
            background-color: #29B895;
            border-radius: 0 !important;
        }

        .navbar-brand {
            color: white;
        }

        .navbar-brand:hover {
            color: white;
        }

        .jumbotron {
            border-radius: 10px;
            padding: 20px;
        }

        .jumbotron h1 {
            margin: 0 0 20px 0;
            font-size: 24px !important;
        }

        .cash-div {
            font-size: 24px;
        }

        .cash-div b {
            margin-right: 10px;
        }

        .red {
            background-color: #D84134;
            color: white;
        }

        .green {
            background-color: #6AC83B;
        }

        .yellow {
            background-color: #FBC34B;
        }

        .blue {
            background-color: #528FD2;
            color: white;
        }

        .black {
            background-color: #414141;
        }

        .plus {
            font-size: 30px;
            margin: 0 10px 0 10px;
        }

        .ball {
            color: white;
            font-size: 20px;
            border-radius: 50%;
            display: inline-block;
            width: 60px;
            height: 60px;
            text-align: center;
            line-height: 60px;
        }

        .attempt-numbers {
            font-size: 18px;
            outline: 1px solid black;
            display: inline-block;
            margin-bottom: 20px;
            margin-right: 20px;
            height: 30px;
        }

        .attempt-number {
            display: inline-block;
            width: 30px;
            text-align: center;
            line-height: 30px;
        }

        .attempt-prize {
            display: inline-block;
            font-size: 18px;
        }
    </style>

    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

    <!-- Optional theme -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">

    <!-- Latest compiled and minified JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
</head>
'''

MAIN_HTML = '''
<!DOCTYPE html>
<html>
    <body>
        <nav class="navbar navbar-fixed-top">
            <div class="container-fluid">
                <!-- Brand and toggle get grouped for better mobile display -->
                <div class="navbar-header">
                    <a class="navbar-brand" href="#">LOTTO</a>
                </div>
            </div><!-- /.container-fluid -->
        </nav>

        <div class="col-xs-10 col-xs-offset-1">
            <div class="jumbotron">
                <h1><b>당첨 번호</b></h1>
                {numbers}
            </div>
        </div>

        <div class="col-xs-5 col-xs-offset-1">
            <div class="jumbotron cash-div">
                <b>당첨 금액</b>
                <span>‎₩{total_prize}</span>
            </div>
        </div>

        <div class="col-xs-5">
            <div class="jumbotron cash-div">
                <b>쓴 금액</b>
                <span>‎₩{total_cost}</span>
            </div>
        </div>

        <div class="col-xs-10 col-xs-offset-1">
            <div class="jumbotron">
                <h1><b>내 번호</b></h1>
                {attempts}
            </div>
        </div>

        <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        <!-- Include all compiled plugins (below), or include individual files as needed -->
    </body>
</html>
'''


def get_color(number):
    if number <= 10:
        return "yellow"
    elif number <= 20:
        return "blue"
    elif number <= 30:
        return "red"
    elif number <= 40:
        return "black"
    else:
        return "green"


def generate_numbers_html(numbers):
    # template for winning ball
    ball_html = '''
    <div class="ball {color}">
        {number}
    </div>
    '''

    html = ""
    for number in numbers[:6]:
        html += ball_html.format(number = number, color = get_color(number))
    html += '<span class="plus">+</span>'
    html += ball_html.format(number = numbers[-1], color = get_color(numbers[-1]))
    return html


def generate_attempt_html(attempt, winning_numbers):
    number_html = '''
    <span class="attempt-number">{number}</span>
    '''

    red_number_html = '''
    <span class="attempt-number red">{number}</span>
    '''

    blue_number_html = '''
    <span class="attempt-number blue">{number}</span>
    '''

    attempt_html = ""
    for num in attempt[0]:
        if num in winning_numbers[:6]:
            attempt_html += red_number_html.format(number=num)
        elif num in winning_numbers[6:]:
            attempt_html += blue_number_html.format(number=num)
        else:
            attempt_html += number_html.format(number=num)

    html = '''
    <div class="attempt">
        <div class="attempt-numbers">
            {attempt}
        </div>
        <div class="attempt-prize">
            ‎₩{prize}
        </div>
    </div>
    '''.format(attempt=attempt_html, prize=attempt[1])
    return html


def main(winning_numbers, tries, total_prize, total_cost):
    out_file = open('lottery.html', 'w', encoding='utf-8')

    winning_numbers_html = generate_numbers_html(winning_numbers)

    attempts_html = ""

    for attempt in tries:
        attempts_html += generate_attempt_html(attempt, winning_numbers)

    out_file.write(HEAD_HTML + MAIN_HTML.format(
        numbers=winning_numbers_html,
        attempts=attempts_html,
        total_prize=total_prize,
        total_cost=total_cost)
    )
    out_file.close()


WINNING_NUMBERS = lottery.draw_winning_numbers()
NUM_TRIES = 100

tries = []
total_prize = 0
total_cost = 0

for i in range(NUM_TRIES):
    attempt = sorted(lottery.generate_numbers(6))
    prize = lottery.check(attempt, WINNING_NUMBERS)
    tries.append((attempt, prize))

    total_prize += prize
    total_cost += 1000

main(
    WINNING_NUMBERS,
    sorted(tries, key=lambda x: -x[1]),
    total_prize,
    total_cost
)

 

cf) PyChram

lottery.html 을 우클릭

Open in -Browser에 마우스 올리고 원하는 브라우저 선택