Python/Numpy

[Numpy] np.random.seed() 의미, random.seed()와 비교

jimmy_AI 2022. 5. 2. 22:28
반응형

넘파이 시드 설정 함수 설명, 내장 모듈의 시드 함수와 차이

파이썬 numpy 라이브러리의 seed 설정 방법과 의미를 살펴보고

내장 모듈인 random 내의 seed 함수와의 관련성과 차이에 대하여 다루어 보겠습니다.

 

 

np.random.seed() 설정법, 의미

np.random.seed(음이 아닌 정수) 형태로 특정 숫자를 지정해주시면

seed 지정 이후에 난수 추출 시 고정된 값들이 출력되는 것을 확인할 수 있습니다.

import numpy as np

### seed 미설정(완전 랜덤) ###
print(np.random.random(5))
# [0.68535982 0.95339335 0.00394827 0.51219226 0.81262096]

print(np.random.random(5))
# [0.61252607 0.72175532 0.29187607 0.91777412 0.71457578]

### seed 설정(난수 고정) ###
np.random.seed(10)
print(np.random.random(5))
# [0.77132064 0.02075195 0.63364823 0.74880388 0.49850701]

np.random.seed(10)
print(np.random.random(5))
# [0.77132064 0.02075195 0.63364823 0.74880388 0.49850701]

참고로, seed 숫자가 달라지면 이후에 추출되는 값들도 달라집니다.

 

 

np.random.seed()과 random.seed()의 연계 가능 여부

넘파이 내의 random 소모듈이 아닌, 파이썬 내장 모듈인 random 패키지에서도

같은 기능을 수행하는 seed 함수를 지원하고 있습니다.

 

테스트 결과, 이 두 함수는 난수 추출시 연계가 되지 않으며, 독립적으로 작용함을 확인했습니다.

 

np.random.seed 설정 후 기본 random 모듈 내에서 난수 추출을 진행한 예시입니다.

import numpy as np
import random

### 넘파이 seed 설정 -> 내장 모듈 난수 추출 ###
np.random.seed(10)
print([random.random() for _ in range(5)])
# [0.603190610968185, 0.3816059859191179, 0.28361821790671515, 0.674964847134956, 0.45683115105830563]

np.random.seed(10)
print([random.random() for _ in range(5)])
# [0.6858614854745947, 0.6618463200523511, 0.1329781447122128, 0.7678378139439905, 0.9824132490111909]
반응형

반대로, 이번에는 random.seed 설정 후 넘파이 모듈로 난수 추출을 해보았습니다.

import numpy as np
import random

### 내장 모듈 seed 설정 -> 넘파이 난수 추출 ###
random.seed(10)
print(np.random.random(5))
# [0.43401399 0.61776698 0.51313824 0.65039718 0.60103895]

random.seed(10)
print(np.random.random(5))
# [0.8052232  0.52164715 0.90864888 0.31923609 0.09045935]

두 코드 모두 seed 설정 이후에도 추출되는 난수 값이 고정되지 않았습니다.

 

 

np.random.seed()과 random.seed()의 또 다른 차이점

np.random.seed 함수 내에는 음이 아닌 정수만 seed 값으로 사용될 수 있는 반면에,

random.seed 함수는 실수 범위 내의 숫자들을 모두 seed 값으로 사용할 수 있다는

차이점도 있습니다.

np.random.seed(10.5) # 불가능(TypeError: Cannot cast scalar from dtype('float64') to dtype('int64') according to the rule 'safe')
np.random.seed(-10) # 불가능(ValueError: Seed must be between 0 and 2**32 - 1)

random.seed(10.5) # 가능
random.seed(-10) # 가능