Python/Python Basic

파이썬 rand, randn, randint, random.sample, seed, size, shuffle - 공부하는 도비

DOVISH WISDOM 2021. 4. 19. 20:26  
728x90
반응형

오늘은 파이썬에서 난수를 출력하는 법에 대해서 알아볼게요. 최근 random 값을 사용해서 프로그램 작성할 일이 많아서, 정리를 쫙해둬야겠어요.

 

우선, 파이썬에서 random을 사용하려면, import random 을 해주고,

(rand, randn, randint)는 numpy와 관련 있어서, import numpy as np를 해주시면 됩니다.

 

* random.random()

: 0부터 1 사이에서 균일한 확률 분포로 실수 난수를 생성

import random

a_1 = random.random()
print("a_1 : ", a_1)

a_2 = random.random()
print("a_2 : ", a_2)

random.random()을 사용하게 되면, 실행할 때마다 다른 값을 출력합니다. 

프로그래밍할 때 랜덤 한 값을 생성하고, 그 값을 프로그램 실행 도중에 계속 사용해야 할 경우도 있습니다. 

그때, 사용하는 것이 seed입니다. 

 

seed는 암호학에서 hash의 입력을 말할 때도 말하는데, 비슷한 개념이에요.

 

* seed()

import random

r_1 = 1  

random.seed(r_1)
b_1 = random.random()

random.seed(r_1)
b_2 = random.random()

r_2 = 2  

random.seed(r_2)
b_3 = random.random()

print("b_1 : ", b_1)
print("b_2 : ", b_2)
print("b_3 : ", b_3)

소스 코드를 보면, r_1과 r_2 두 개의 seed값을 사용하고 있습니다.

b_1과 b_2는 동일한 seed를 사용하고 있고, b_3는 다른 seed값을 사용하고 있습니다. 결과를 확인해보면,

b_3만 다른 값인걸 알 수 있습니다.

 

 

* random.sample(range(p, q), r)

앞에서는 범위를 지정하지 않고, 랜덤 한 값 하나를 출력했다면,  이제는 범위, 개수를 지정하고 겹치지 않게 랜덤 한 값을 출력받는 법을 알아보겠습니다.

 

p부터 q-1까지 r 개의 겹치지 않는 랜덤 한 값을 출력합니다.

중복되지 않게 값을 출력받는 방법엔 여러 가지 있지만, sample을 사용하는 게 제일 편하고, 깔끔해서 자주 사용한답니다.

 

* random.shuffle()

이번엔, 배열의 원소를 섞어주는 shuffle 함수에 대해서 알아볼게요.

import random

start_list = list(range(0, 7, 1))
print("Before Shuffle : ", start_list)

random.shuffle(start_list)

print("After Shuffle  : ", start_list)

 

이제는 numpy를 사용하면서, 난수를 활용해볼게요.

(numpy는 파이썬에서 다차원 배열을 처리하는데 필요한 여러 유용한 기능을 제공하는 라이브러리입니다.)

 

* np.random.rand()

0부터 1 사이에서 균일한 확률 분포로 실수 난수를 생성합니다. (random.random()과 동일해요.)

 

* np.random.rand(p)

0부터 1사이 균일 분포 난수 n개 배열 생성

 

* np.random.rand(p, q)

0부터 1사이 균일 분포 난수를 matrix array(p, q)로 생성

* np.random.randn()

randn은 기댓값이 0이고, 표준편차가 1인 가우시안 표준 정규 분포를 따르는 난수를 생성합니다. 

 

좀 더 쉽게 설명하기 위해서, matplotlib.pyplot를 사용해서 총 1000개의 난수 분포도를 출력해보았습니다. 

가우시안 분포는 자연 데이터처럼 종 모양의 분포도를 가지는 것을 의미합니다. 

* np.random.randint()

앞에서는 거의 소수점 형태의 랜덤 한 값을 출력했는데, 이제는 정수 난수를 출력해보겠습니다.

(randint()는 매개변수를 항상 주어야 합니다)

 

* np.random.randint(n)

0부터 n-1까지 랜덤 한 정수 1개 출력

 

* np.random.randint(n, m)

n부터 m-1까지 랜덤 한 정수 1개 출력

* 응용 (np.random.randint(n, size = m))

0부터 n - 1까지 랜덤 한 값을 m 길이만큼 출력합니다.

이거 만큼 편한 게 없어요 ㅜ

bit 단위의 랜덤 한 값이 필요할 때 사용하면 아주 좋습니다.

 

 

* 응용 (seed 사용)

np.random.seed(r)

np.random.randint(n, size = m)

앞에서 설명한 seed를 randint에 사용한 것입니다.

 

 

 

이렇게 해서 파이썬의 random 함수에 대해서 정리해보았습니다.!