17.2 반복 횟수가 정해지지 않은 경우

지금까지 조건식에서 반복 횟수를 정한 뒤 변수 i를 증가시키거나 감소시켜서 while 반복문을 사용했습니다. 하지만 while 반복문은 반복 횟수가 정해지지 않았을 때 주로 사용합니다.

이번에는 난수를 생성해서 숫자에 따라 반복을 끝내 보겠습니다. 난수(random number)란 특정 주기로 반복되지 않으며 규칙 없이 무작위로 나열되는 숫자를 뜻합니다. 현실에서 쉽게 접할 수 있는 난수가 바로 주사위를 굴려서 나온 숫자입니다.

그림 17-3 주사위

파이썬에서 난수를 생성하려면 random 모듈이 필요합니다. 모듈은 다음과 같이 import 키워드를 사용하여 가져올 수 있습니다(모듈은 'Unit 44 모듈과 패키지 사용하기'에서 자세히 설명 하겠습니다).

  • import 모듈
import random    # random 모듈을 가져옴

이제 random.random()으로 random 모듈의 random 함수를 호출해봅니다.

>>> random.random()
0.002383731799935007
>>> random.random()
0.3297914484498006
>>> random.random()
0.6923390064955324

random.random()을 실행할 때마다 계속 다른 실수가 출력되죠? 바로 이 숫자가 바로 난수입니다.

우리는 숫자를 좀 더 알아보기 쉽도록 정수를 생성하는 random 모듈의 randint 함수를 사용해보겠습니다. 다음과 같이 randint 함수는 난수를 생성할 범위를 지정하며, 범위에 지정한 숫자도 난수에 포함됩니다.

  • random.randint(a, b)

그럼 randint 함수로 주사위를 만들어보겠습니다. 보통 정육면체 주사위는 1부터 6까지 숫자가 있죠? 따라서 random.randint(1, 6)처럼 1과 6을 넣으면 1과 6 사이의 난수가 생성됩니다.

>>> random.randint(1, 6)
4
>>> random.randint(1, 6)
1
>>> random.randint(1, 6)
5

random.randint(1, 6)을 실행할 때마다 다른 숫자가 나옵니다. 이제 이 함수를 while 반복문에 사용해보겠습니다.

다음은 1과 6 사이의 난수를 생성한 뒤 3이 나오면 반복을 끝냅니다. 그냥 3이 나올 때까지 주사위를 계속 던지는 행동과 같습니다.

while_random.py

import random    # random 모듈을 가져옴
 
i = 0
while i != 3:    # 3이 아닐 때 계속 반복
    i = random.randint(1, 6)    # randint를 사용하여 1과 6 사이의 난수를 생성
    print(i)

실행 결과

5
1
4
1
1
3 

while 반복문에서 i != 3과 같이 조건식을 지정하여 3이 아닐 때 계속 반복하도록 만듭니다. 그리고 반복할 코드에서 i = random.randint(1, 6)과 같이 1과 6 사이의 난수를 생성하여 변수 i에 저장합니다.

이제 이 코드를 여러 번 실행해봅니다. 실행 결과를 보면 정수가 무작위로 생성되어 실행할 때마다 반복 횟수가 달라지는 것을 볼 수 있습니다. 이처럼 while 반복문은 반복 횟수가 정해져 있지 않을 때 유용합니다.

참고 | random.choice

random.choice 함수를 사용하면 시퀀스 객체에서 요소를 무작위로 선택할 수 있습니다. 다음은 1, 2, 3, 4, 5, 6이 들어있는 리스트에서 무작위로 숫자를 선택합니다.

random.choice(시퀀스객체)

>>> dice = [1, 2, 3, 4, 5, 6]
>>> random.choice(dice)
1
>>> random.choice(dice)
4
>>> random.choice(dice)
3

물론 random.choice 함수는 시퀀스 객체를 받으므로 리스트뿐만 아니라 튜플, range, 문자열 등을 넣어도 됩니다.