난수와 관련된 문제에 대한 풀이입니다. 각자 정답이 다를 수 있습니다. 자신의 코드와 비교해 보고 어떤 게 더 효율적이고 가독성이 좋은지 판단해서 자신의 실력을 업그레이드하는 것이 중요하다고 생각합니다.
정수형 난수 만들기
random 모듈의 randrange()나 randint()를 이용하면 원하는 정수 범위 안에서 난수를 만들 수 있습니다.
import random
random.randrange(1,10) # 1~9까지의 정수를 하나를 랜덤으로 생성(10은 생성하지 않음.)
1
import random
random.randrange(1, 10, 3) # 1, 4, 7 중 하나를 랜덤으로 생성
7
import random
random.randint(1, 7) # 1 이상 7이하의 정수 중 하나를 임의로 생성
4
우리가 그때그때 머리속에 떠올리는 난수는 진정한 난수라고 할 수 있습니다. 컴퓨터가 발생시키는 난수는 진정한 의미는 아닙니다. 내부적으로 규칙을 가지고 발생시키기 때문에 seed()를 이용해서 재현이 가능합니다. 예를 들어서 난수의 씨앗(seed)을 설정해준 후에 난수를 만들면 같은 숫자가 반복해서 만들어집니다.
import random
random.seed(1)
for i in range(25):
print(random.randint(1, 7), end=" ")
2 5 7 7 7 1 3 1 4 7 4 4 6 4 7 2 1 4 1 7 4 4 5 7 7
import random
random.seed(1)
for i in range(25):
print(random.randint(1, 7), end=" ")
2 5 7 7 7 1 3 1 4 7 4 4 6 4 7 2 1 4 1 7 4 4 5 7 7
import random
random.seed(2)
for i in range(25):
print(random.randint(1, 7), end=" ")
7 7 1 1 1 3 7 2 6 7 6 7 3 3 5 2 5 1 5 6 2 4 6 4 7
seed를 고정시키는 방법은 알고리즘의 오류를 체크하기 위해서 항상 동일한 패턴의 난수를 발생시킬 때 사용할 수 있습니다.
실수형 난수 만들기
여기서 실수는 부동소수점 표현법을 사용하는 float 자료형을 의미합니다. 보통 random(), uniform(), gauss() 세 가지를 많이 사용하는데 여기서는 기본적인 함수 사용법만 확인해보도록 하겠습니다.
import random
random.random() # 0.0 이상 1.0 미만의 float형 난수
0.7230120812374659
import random
random.uniform(0.0, 1.0) # 0.0이상 1.0 이하의 float형 균일 분표
0.9948195629497427
import random
random.gauss(0.5, 0.01) # 평균이 0.5이고 표준편차가 0.01인 정규 분포
0.5119068435790313
승객태우기
50명이 택시를 호출하였다고 가정합니다. 그런데 승객을 태우러 가는데 걸리는 시간 5분 이상 15분 이내인 경우만 승객을 받는다고 가정하고 총 몇 명의 승객이 태웠는지 알려주는 프로그램을 작성.
from random import *
count = 0
for customer in range(1, 51) :
time = randint(5, 50)
if 5<= time <= 15 :
cnt += 1
print('[o]', '{0}번째 손님 (소요시간 : {1}분'.format(customer, time))
else :
print('[ ]', '{0}번째 손님 (소요시간 : {1}분'.format(customer, time))
print('총 탑승승객 : {0} 명'.format(count))
주사위 굴리기
가상의 주사위를 숫자 3이 나올 때까지 굴려봅시다. 주사위를 굴리는 동작을 1 이상 6 이하의 정수형 난수를 만드는 것으로 대신합니다. while루프를 사용하세요. 마지막 3도 출력이 되어야 하며 print()
는 한 번만 사용합니다.
import random
num = 0
while num != 3 :
num = random.randint(1, 6)
print(num, end=" ")
4 5 3
import random
while True:
dice = random.randint(1, 6)
print(dice, end=" ")
if dice == 3:
break
4 3
현실을 단순화시켜서 어떤 일이 벌어지는지 가상으로 실행해보는 것을 시뮬레이션(simulation)이라고 부릅니다.
주사위 2개 굴리기
이번에는 가상의 주사위를 2개 굴려서 합이 6이 될 때까지 반복해봅시다.
import random
my_sum = 0
while True:
dice_1 = random.randint(1, 6)
dice_2 = random.randint(1, 6)
my_sum = dice_1 + dice_2
print((dice_1, dice_2), end=" ")
if my_sum == 6:
break
(4, 4) (5, 2) (5, 2) (2, 2) (1, 2) (3, 2) (2, 5) (5, 3) (5, 6) (5, 2) (4, 4) (6, 5) (3, 5) (3, 3)
숫자 맞추기 게임
컴퓨터가 1 이상 100 이하의 난수를 하나 만든 후에 사용자에게 맞추도록 하는 게임을 만들어봅시다.
import random
num = random.randint(1, 100)
try_count = 0
while True:
user_input = int(input("1 이상 100 이하의 자연수를 입력하세요: "))
try_count += 1
if user_input > num:
print(f"{user_input} 보다 작습니다.")
elif user_input < num:
print(f"{user_input} 보다 큽니다.")
else:
print("축하합니다.")
print(f"{num} 을 {try_count} 회 만에 맞추셨습니다")
break
1 이상 100 이하의 자연수를 입력하세요: 50
50 보다 큽니다.
1 이상 100 이하의 자연수를 입력하세요: 80
80 보다 큽니다.
1 이상 100 이하의 자연수를 입력하세요: 90
90 보다 큽니다.
1 이상 100 이하의 자연수를 입력하세요: 95
95 보다 큽니다.
1 이상 100 이하의 자연수를 입력하세요: 97
축하합니다.
97 을 5 회 만에 맞추셨습니다
산수 문제 생성기
난수를 이용해서 간단한 사칙 연산 문제를 만들고 사용자가 맞출 때까지 답을 입력받는 프로그램을 만들어봅시다. 1이상 9 이하의 정수형 난수 두 개를 피연산자로 사용하고 0 이상 3 이하의 정수형 난수를 만들어서 4가지 연산자 ("+", "-", "*", "//") 중에서 하나를 임의로 선택하게 해 보세요. 나누기는 답이 정수가 나오도록 정수 나누기(//)를 사용합시다.
4가지 연산자에 대해 if-elif
를 사용해서 만들어보세요.
import random
num1, num2 = random.randint(1, 9), random.randint(1, 9)
op = random.randint(0, 3)
while True:
if op == 0:
if int(input(f"{num1} + {num2} 을 맞쳐보세요: ")) == num1 + num2:
print(f"축하합니다. 정답 {num1 + num2} 을 잘 맞추셨습니다.")
break
elif op == 1:
if int(input(f"{num1} - {num2} 을 맞쳐보세요: ")) == num1 - num2:
print(f"축하합니다. 정답 {num1 - num2} 을 잘 맞추셨습니다.")
break
elif op == 2:
if int(input(f"{num1} * {num2} 을 맞쳐보세요: ")) == num1 * num2:
print(f"축하합니다. 정답 {num1 * num2} 을 잘 맞추셨습니다.")
break
else:
if int(input(f"{num1} // {num2} 을 맞쳐보세요: ")) == num1 // num2:
print(f"축하합니다. 정답 {num1 // num2} 을 잘 맞추셨습니다.")
break
print("정답이 아니네요. 다시 도전하세요!")
8 // 5 을 맞쳐보세요: 3
정답이 아니네요. 다시 도전하세요!
8 // 5 을 맞쳐보세요: 1
축하합니다. 정답 1 을 잘 맞추셨습니다.
if
는 사용하지 않고 eval()
과 while
을 사용해서 간결하게 구현해보세요. random.choice()
는 시퀀스의 아이템 중 하나를 랜덤 하게 골라줍니다.
import random
num1, num2 = random.randint(1, 100), random.randint(1, 100)
op = random.choice(("+", "-", "*", "//"))
while True:
if eval(input(f"{num1} {op} {num2} 을 맞쳐보세요: ")) == eval(f"{num1} {op} {num2}"):
print(f"축하합니다! 정답 {eval(f'{num1} {op} {num2}')} 을 맞추셨습니다.")
break
print("아쉽지만 틀렸군요. 다시 도전하세요!")
3 // 5 을 맞쳐보세요: 0
축하합니다! 정답 0 을 맞추셨습니다.
'수학과 코딩' 카테고리의 다른 글
파이썬 리스트 컴프리헨션 사용법 정리 (0) | 2022.08.09 |
---|---|
python list, set, dict, tuple comprehensions (0) | 2022.08.09 |
python 난수(random, range, int, choice)등 정리 및 문제 (0) | 2022.08.06 |
윤년찾기(leap year) 파이썬(python) 날짜와 시간(date and time) (0) | 2022.08.04 |
Python 평균(Mean), 회문(Palindrome)검사, 플로이드 삼각형 (0) | 2022.08.04 |
댓글