TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] 파이썬 기초 - 랜덤 모듈

by 기록자_Recordian 2025. 1. 15.
728x90
반응형
이전 내용
 

[파이썬] 파이썬 기초: 함수 (보완)

파이썬 함수 (다른 글) [파이썬] 파이썬기초: 함수시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적

puppy-foot-it.tistory.com


랜덤 모듈

 

랜덤 모듈은 파이썬을 설치할 때 기본적으로 깔리는 모듈 (내장함수)로, 무작위의 값을 추출할 때 유용하게 사용가능하다.

 

파이썬 내에서 랜덤 모듈을 호출하기 위해서는

import random

의 명령문으로 해당 모듈을 호출한다.

 

★ 내장함수란(Built-in Functions)?

 

[파이썬] 파이썬기초: 내장 함수(Built-in Functions)

시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.내장 함수(Built-in Funct

puppy-foot-it.tistory.com


랜덤 모듈 종류(많이 사용되는)

 

★모든 함수는 사용 시 앞에 "random." 을 붙인다.

 

◆ random: 0부터 1미만의 실수를 임의로 생성

num = random.random()
print(num)

 

◆ randrange(시작, 끝): 시작부터 끝-1 사이의 정수를 임의로 생성

print(random.randrange(1, 7)) # 1부터 6사이 임의의 정수

 

◆ randint(시작, 끝): 시작부터 끝 포함 사이의 정수를 임의로 생성

print(random.randint(1, 7)) #1부터 7사이 임의의 정수

 

◆ choice: 원소 중 아무거나 하나를 뽑아준다.

menu = ["김밥", "떡볶이", "순대"]
print("오늘의 메뉴는?", random.choice(menu))

list_a = list(range(1, 51)) # 1부터 50까지 리스트로 생성
print(random.choice(list_a))

 

◆ shuffle: 원소를 섞는다.

result = list(range(1, 11))
print("섞기 전: ", result)
random.shuffle(result)
print("섞은 후: ", result)

 

 

랜덤 모듈을 이용하면 아래와 같이 로또 프로그램을 생성할 수 있다.

 

[파이썬] 로또 번호 생성 프로그램 만들기

수행 내용 및 목표 로또 번호를 생성해주는 (6개 번호 * 5개) 코드를 짜고,이를 실행 프로그램으로 만든다.로또 번호 생성 코드 짜기 로또 번호를 생성하는 방법의 경우,딥러닝을 통해 과거 당첨

puppy-foot-it.tistory.com


랜덤 모듈 예제(feat. 반복문)

 

어떤 사람이 50달러를 가지고 라스베가스에서 게임을 한다고 하자. 한 번의 게임에 1달러를 거는데, 돈을 딸 확률은 0.5이다. 한 번 라스베가스에 가면, 가진 돈을 다 잃거나 목표 금액인 250달러에 도달할 때까지 게임을 계속한다. 어떤 사람이 라스베가스에 100번을 갔다면 몇 번이나 250달러를 따서 돌아올 수 있을까?

출력 예
초기 금액 $50
목표 금액 $250
100번 중에서 21번 성공

 

▶ 수업 시간에 해당 문제를 풀이하는데 문제 조차도 이해가 되질 않아 오랜 시간이 지나도 못 풀었다.

내가 제대로 풀지 못했던 이유는

  • 문제 이해를 제대로 못함
  • 코드의 대략적인 구조를 알려주셨는데, 안 보고 해보겠다고 설침

처음의 코드는 (수정하면서 최초 코드가 없다.) 대략 아래와 같았는데, (아래의 코드는 에러가 발생한다.)

# 잘못된 코드
import random

money = 50 # 시작
goal = 250 # 목표
wins = 0 # 승리
game = 0 # 게임 횟수
total_game = 100 # 100회 게임
result_list = ["승리", "패배"]

print(f"초기금액은 {money}달러 입니다.")
print(f"목표금액은 {goal}달러 입니다.")

for game in range(total_game):
  total_game += game
  while True:
    result = random.choice(result_list)
    if result == "승리":    
      money += 1
      wins += 1
    
    elif result == "패배":
      money -= 1
    
    elif money == 0:
      print("금액을 모두 소진하였습니다. 게임을 종료합니다.")
      break

    elif money == goal:
      print("목표 금액을 모두 획득 하였습니다. 게임을 종료합니다.")
      break

print(f"{total_game}번의 경기 중 {wins}번 승리하였습니다.")
print(f"승률은 {wins/total_game*100:.2f}% 입니다.")

 

승률이 40~50% 대로 계속 나왔다. 다른 학우들은 10~30% 이내로 나오는 상황이었고,

나는 코드 구조 자체가 잘못됐다는 것을 인지하지 못하고, 왜 승률이 이렇게 높을까에만 초점이 맞춰져 있었다.

- 매회 방문 시 50달러를 가져가고

- 달러를 모두 소진하거나, 250달러를 땄을 때 회차 방문이 종료된다

는 중요한 점을 간과하였다.

 

 

우선, 선생님의 답

import random

money = 50 # 시작
goal = 250 # 목표
wins = 0 # 승리
total_game = 100

# 100번 방문 시 50달러를 가지고 간다.
for i in range(total_game):
  cash = money # 초기 금액 복사

  # 돈이 0이거나 250을 따면 종료
  while cash > 0 and cash < goal:
    # 돈이 0보다 크거나 목표보다 작으면 게임(승패 출력)
    result = random.choice([True, False])

    # 승리한 경우 1달러를 더해주고, 패할 경우 1달러를 뺀다.
    if result:
      cash += 1
    else:
      cash -= 1

  if cash == goal:
    wins += 1

print(f"초기금액은 {money}달러 입니다.")
print(f"목표금액은 {goal}달러 입니다.")
print(f"{total_game}번의 경기 중 {wins}번 승리하였습니다.")
print(f"승률은 {(wins/total_game) * 100:.1f} % 입니다.")

  • for문을 만들고 100회 반복 하도록 range(total_game)
  • for문 내에 cash 라는 변수를 만들고 money의 초깃값 저장: 1번 방문 시 50달러를 가지고 간다.
  • while cash 0 > and cash < goal: cash가 0보다 크고 목표값인 250보다 작을 동안
  • result = random.choice([True, False]) : True 또는 False를 랜덤으로 선택하여 result 변수에 저장한다.
  • if result: : 만약 result가 True 일 경우 현금에 1을 더해주고,
  • else: False 일 경우 현금을 1 뺀다.
  • if cahse == goal:: 만약 현금이 목표치가 됐을 경우, 승리에 1을 더해준다. (100번 간 중에 몇 번 250 달러를 따고 돌아왔는지를 계산하기 위해)

 

내 코드1

import random

money = 50 # 시작
goal = 250 # 목표
wins = 0 # 승리
total_game = 100

# 라스베가스에 100번 방문
for game in range(total_game):
  cash = money

  while cash > 0 and cash < goal:
    result = round(random.random(),1)

    if result > 0.5: # 승리
      cash += 1

    elif result < 0.5 : # 패배
      cash -= 1
    
  if cash == goal:
    wins += 1

print(f"초기금액은 {money}달러 입니다.")
print(f"목표금액은 {goal}달러 입니다.")
print(f"100번의 경기 중 {wins}번 승리하였습니다.")
print(f"승률은 {(wins / game) * 100:.1f}%입니다.")

▶ random.random() 으로 0과 1미만 사이의 실수를 반환 받은 뒤, 소수점 한 자리 미만으로 자리수를 맞춘 후 result라는 변수에 저장.

result가 0.5보다 많으면 승리로, 적으면 패배로 인식하는 방식으로 했다.

 

내 코드2

import random

money = 50 # 시작
goal = 250 # 목표
wins = 0 # 승리
game = 0 # 게임 횟수
total_game = 100 # 100회 게임
result_list = ["승리", "패배"]


for game in range(total_game):
  cash = money
  while cash > 0 and cash < 250:
    result = random.choice(result_list)
    if result == "승리":    
      cash += 1

    elif result == "패배":
      cash -= 1

  if cash == goal:
    wins += 1

print(f"초기금액은 {money}달러 입니다.")
print(f"목표금액은 {goal}달러 입니다.")
print(f"{total_game}번의 경기 중 {wins}번 승리하였습니다.")
print(f"승률은 {wins/total_game*100:.2f}% 입니다.")

▶ result_list 라는 변수에 ["승리", "패배"] 라는 리스트를 할당하고

random.choice를 하여 승리 또는 패배를 골라 result 변수에 대입하도록 하였다.

그리고 result가 승리 또는 패배인 경우에 따라 다른 결과가 실행되도록 하였다. (이전 코드들과 동일)

 


[출처]

왕초보를 위한 Python: 쉽게 풀어 쓴 기초 문법과 실습

728x90
반응형