-
파이썬 random으로 로또 번호 생성기, 경품 추첨기 만들기Python/이것저것 파이썬 2021. 11. 1. 08:11반응형
https://docs.python.org/ko/3/library/random.html
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)
반응형