ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 random으로 로또 번호 생성기, 경품 추첨기 만들기
    Python/이것저것 파이썬 2021. 11. 1. 08:11
    반응형

    https://docs.python.org/ko/3/library/random.html

     

    random — 의사 난수 생성 — Python 3.10.0 문서

    random — 의사 난수 생성 소스 코드: Lib/random.py 이 모듈은 다양한 분포에 대한 의사 난수 생성기를 구현합니다. 정수에 대해서는, 범위에서 균일한 선택이 있습니다. 시퀀스에 대해서는, 무작위

    docs.python.org

     

    random.shuffle

    시퀀스 x를 제자리에서 섞습니다.

    shuffle을 이용해 100명 중에 (순서가 있는) 3명을 뽑아봅시다. 

    result는 추첨함이라고 생각합시다. 
    추첨함에 0~99 까지 번호표를 넣고,
    4번 흔든(셔플한) 뒤,
    3장의 번호표를 뽑는 과정입니다.

    실 생활속의 추첨 과정과 거의 같도록 코딩해 보았습니다. 

    from random import shuffle
    
    applicants = 100  # 지원자 수
    winners = 3  # 당첨자 수
    shuffle_times = 4  # 셔플 횟수
    
    # 추첨 결과가 담길 배열
    result = [index for index in range(applicants)]
    
    for _ in range(shuffle_times):
        shuffle(result)
    
    for index in range(winners):
        print(index, result[index])

    random.sample을 이용하면 비슷하지만, 조금 더 단순하게 코딩할 수 있습니다. 

     

    random.sample

    리스트 등의 시퀸스에서 중복되지 않는 복수의 요소를 고릅니다. 

    from random import sample
    
    applicants = 100  # 지원자 수
    winners = 3  # 당첨자 수
    
    # 추첨 결과가 담길 배열
    result = sample(range(applicants), winners)
    
    for index, winner in enumerate(result):
        print(index, winner)

    range 함수와 궁합이 좋습니다. 

    0~99 중 3개를 고릅니다.

     

    random.choice

    리스트 등의 시퀸스에서 1개를 고를 때.
    중복가능한 복수의 요소를 고를 수도 있습니다. 

     

    random.random

    제가 처음 코딩을 배울 때 쓰던 언어들은
    random 함수만 있는 경우가 많았기 때문에
    아래와 비슷하게 코딩했었습니다. 

    from random import random
    
    applicants = 100  # 지원자 수
    winners = 3  # 당첨자 수
    
    result = []
    
    while len(result) != winners:
        temp = int(random() * applicants)
        if temp not in result:
            result.append(temp)
    
    for index, value in enumerate(result):
        print(index, value)

    * 파이썬에서 int(random()*n)은 약간 고르지 않은 분포를 생성할 수 있습니다.
    * 위 코드는 쓰지 마십시오. 
    * randrange를 쓰는 것이 더 좋습니다. 

    1. 랜덤으로 범위에 맞는 하나의 숫자를 뽑습니다.
    이 때 랜덤의 범위(= 경곗값들의 포함 여부)를 꼭 확인해야 합니다.

    random() 함수는 0 <= random() < 1 의 범위를 가집니다. 
    100을 곱하면 0 <= random() * 100 < 100 입니다. 
    int를 걸면 0 부터 99 까지의 정수가 나옵니다. 

    2. 이것이 이미 '당첨된 숫자'인지 확인을 합니다.

    3. '당첨된 숫자'면 재 추첨, 
    '당첨되지 않은 숫자'면 '당첨된 숫자 배열'에 기록

    4. 당첨자가 모두 추첨되면, 당첨자 출력

    조금 복잡합니다. 

     

    random.randrange

    int(random() * x) 보다 randrange를 이용하는 것이 좀 더 명확, 정확합니다. 

    * 파이썬에서 int(random()*n)은 약간 고르지 않은 분포를 생성할 수 있습니다.

    from random import randrange
    
    applicants = 100  # 지원자 수
    winners = 3  # 당첨자 수
    
    result = []
    
    while len(result) != winners:
        temp = randrange(100)
        if temp not in result:
            result.append(temp)
    
    for index, value in enumerate(result):
        print(index, value)

    random.randrange의 유사품 randint도 있습니다. 

     

    random.randint(a, b)

    a <= N <= b를 만족하는 임의의 정수 N을 반환합니다. 
    randrange(a, b+1)의 별칭.

    익숙하지 않은 범위 입니다. 사용시 주의...
    프로그래머들은 보통 a <= N < b에 익숙합니다. 

     

    로또 번호 생성기

    from random import sample
    
    print(sorted(sample(range(1, 46), 6)))

    1~45 중 6개를 고릅니다. 
    파이썬으론 2줄이면 충분합니다. 

     

    [응용문제]

    1000명에게 1000개의 상품을 나눠줘야 합니다. 
    상품은 4종, 각각의 확률은 다음과 같습니다.
    'A': 10, 'B': 20, 'C': 30, 'D': 40.

    from random import shuffle
    
    probabilities = {'A': 10, 'B': 20, 'C': 30, 'D': 40, }  # 4가지 상품, 각 10%, 20%, 30%, 40%의 확률
    chances = 1000  # 총 추첨 수
    shuffle_times = 4  # 셔플 횟수
    
    # 추첨 결과가 담길 배열
    gifts = [gift 
             for gift, probability in probabilities.items()
             for _ in range(chances * probability // 100)]
    
    for _ in range(shuffle_times):
        shuffle(gifts)
    
    for index, gift in enumerate(gifts):
        print(index, gift)

    확률(비율)에 맞춰 상품을 리스트에 넣은 뒤, 
    셔플을 4번 하고, 하나씩 뽑습니다. 

    random.sample을 이용해도 됩니다. 

    from random import sample
    
    probabilities = {'A': 10, 'B': 20, 'C': 30, 'D': 40, }  # 4가지 상품, 각 10%, 20%, 30%, 40%의 확률
    chances = 1000  # 총 추첨 수
    
    # 추첨 결과가 담길 배열
    gifts = [gift
             for gift, probability in probabilities.items()
             for _ in range(chances * probability // 100)]
    
    gifts = sample(gifts, chances)
    
    for index, gift in enumerate(gifts):
        print(index, gift)
    반응형
Designed by Tistory.