본문 바로가기
Python

[Python] 파이썬 랜덤(Random) 숫자 생성, 난수 생성 방법 - Random 모듈

by A6K 2022. 10. 28.

프로그램을 작성하다보면 난수, 즉 랜덤 숫자를 생성해야 할 경우가 많다. 랜덤 숫자는 주사위 던지기를 생각해보면 편하다. 주사위를 던져서 숫자가 나오기 전까지 어떤 숫자가 나올지 모른다. 1부터 6까지 숫자가 동일한 확률로 등장하게 된다.

이처럼 랜덤 숫자 역시 다음에 어떤 숫자가 나올지 정해져 있지 않고, 주사위를 던지는 것처럼 랜덤 숫자 생성 함수를 실행해봐야 어떤 숫자가 나올지 알게 된다.

랜덤 숫자를 이용하면 로또 숫자를 뽑는 프로그램이나 제비뽑기 같이 확률상 동등한 선택지 중에 하나를 뽑는 프로그램을 작성할 수 있다.

random 모듈

파이썬은 뭔가 랜덤한 어떤 동작을 필요로 하는 경우를 위해서 random 모듈을 제공한다. 랜덤 숫자를 생성하거나 리스트를 랜덤하게 섞는 등의 동작이 random 모듈에 구현되어 있다.

random 모 듈에 있는 함수들을 사용하기 위해서는 import random 으로 모듈을 포함시켜야 한다. 그리고 random.random() 처럼 함수들 앞에 random 모듈이름을 붙여서 호출하면 된다.

random()

random 함수는 0.0이상 1.0 미만의 실수(float) 값을 반환한다. 즉 random() 함수가 리턴하는 x의 값은 0.0 ≤ x < 1.0의 값이다. 1.0을 포함하지 않는 다는 점을 유의하자. (0.0 ≤ x < 1.0)

print (random.random())

# 0.06446081635181633

uniform(a, b)

random.uniform() 함수는 두 개의 인자를 받는다. 두 개의 인자로 받은 숫자들을 범위로 해서 그 숫자들 사이 값 중에 임의로 실수(float)하나를 리턴해준다. (a ≤ x <b)

print (random.uniform(0.0, 2.0))

# 1.6786643602794833

randint(a, b)

randint는 임의의 정수값(Random Integer)을 리턴한다. 두 개의 인자를 받아 그 숫자들을 범위로 해서 그 사이 값 중에 임의로 정수(integer) 하나를 리턴해준다. (a ≤ x <b)

print (random.randint(0, 10))

# 9

randrange(a, b)

randrange() 함수는 인자를 한개 혹은 두개 받을 수 있다. 인자를 하나 받으면 두 숫자를 범위로해서 두 숫자 범위 내에서 랜덤한 정수(int) 값 하나를 뽑아온다. 두 번재 인자인 b 값은 범위에 포함되지 않는다. (a ≤ x <b)

randrange() 함수가 인자를 하나 받으면 0부터 인자로 받은 숫자 사이에서 정수 값을 뽑아온다. 이때에도 인자로 받은 숫자는 포함되지 않는다. (0 ≤ x <a)

print (random.randrange(10, 20))
print (random.randrange(10))

# 11
# 2

choice(list)

choice() 함수는 인자로 리스트나 문자열, 튜플, range 같은 객체를 받는다. 인자로 받은 객체를 구성하는 엘리먼트 중에 임의로 하나의 엘리먼트를 뽑아서 리턴해준다.

만약 비어있는 객체인 경우 indexError 예외가 발생한다. 

fruit = ['apple', 'banana', 'pear', 'strawberry', 'pineapple']
print(random.choice(fruit))

# pear

empty = list()
print(random.choice(fruit))

# Traceback (most recent call last):
#   File "./test.py", line 7, in <module>
#    print(random.choice(list()))
#  File "/usr/lib/python3.8/random.py", line 290, in choice
#    raise IndexError('Cannot choose from an empty sequence') from None
# IndexError: Cannot choose from an empty sequence

sample(list, N)

sample() 함수는 두 개의 인자를 입력으로 받는다. 첫 번째는 choice() 함수처럼 엘리먼트가 담겨있는 문자열이나 튜플, range, 리스트 같은 객체를 인자로 받는다. 두 번째는 숫자를 받는데, 입력한 숫자 개수만큼 값을 뽑아내 리스트로 반환한다.

fruit = ['apple', 'banana', 'pear', 'strawberry', 'pineapple']
print(random.sample(fruit, 2))

# ['apple', 'pear']

두 번째 인자로 받은 숫자가 리스트에 담겨 있는 엘리먼트의 숫자보다 크다면, 혹은 문자열의 길이보다 크다면 valueError가 발생한다.

fruit = ['apple', 'banana', 'pear', 'strawberry', 'pineapple']
print(random.sample(fruit, 12))

# Traceback (most recent call last):
#   File "./test.py", line 2, in <module>
#     print(random.sample(fruit, 12))
#   File "/usr/lib/python3.8/random.py", line 363, in sample
#     raise ValueError("Sample larger than population or is negative")
# ValueError: Sample larger than population or is negative

shuffle(list)

shuffle() 함수는 인자로 받은 리스트의 엘리먼트 순서를 무작위로 섞어 준다. 위에서 봤던 함수와 다르게 shuffle() 함수는 문자열이나 튜플, range 객체를 인자로 받을 수 없다.

fruit = ['apple', 'banana', 'pear', 'strawberry', 'pineapple']
random.shuffle(fruit)
print(fruit)

# ['pineapple', 'pear', 'strawberry', 'apple', 'banana']

주의할 점은 shuffle() 함수는 별도의 리턴값이 없고 인자로 받은 리스트의 내부 순서만 섞어준다는 점이다. 인자로 받은 리스트 자체가 변경된다는 점은 주의해야한다.


 

파이썬 스크립트 작성에 도움되는 글 모음

파이썬으로 프로그램을 작성할 때 도움되는 글들을 모아본다. 개발환경 [Python] macOS에 파이참 설치 [Python] 파이참 깃허브 연동 [Python] 파이썬 PIP란? [Python] VSCode를 이용한 개발환경 [Python] python3..

hbase.tistory.com

 

댓글