일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Apache
- PANDAS
- dataframe
- Google Spreadsheet
- Github
- Python
- PostgreSQL
- 파이썬
- Tkinter
- GIT
- Excel
- string
- Redshift
- Kotlin
- gas
- Google Excel
- SQL
- django
- list
- PySpark
- Mac
- math
- matplotlib
- hive
- numpy
- array
- google apps script
- c#
- Java
- Today
- Total
달나라 노트
Python numpy : random seed (예상되는 난수 생성하기) 본문
import numpy as np
arr_1 = np.random.rand(5)
print(arr_1)
arr_2 = np.random.rand(5)
print(arr_2)
-- Result
[0.64589411 0.43758721 0.891773 0.96366276 0.38344152]
[0.79172504 0.52889492 0.56804456 0.92559664 0.07103606]
numpy의 rand method로 랜덤한 숫자를 생성하면 위처럼 생성할때마다 다른 숫자가 return될겁니다.
(같은 숫자가 return될 확률도 있지만 너무나도 적은 확률이겠죠.)
import numpy as np
np.random.seed(seed=0)
arr_1 = np.random.rand(5)
print(arr_1)
np.random.seed(seed=0)
arr_2 = np.random.rand(5)
print(arr_2)
-- Result
[0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
[0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
그러면 위 코드를 봅시다.
이전에 봤던 예시와의 차이는 동일하게 rand method를 사용하여 랜덤한 숫자들을 추출하고 있으나 seed method가 더해진 것일 뿐입니다.
그 결과를 보면 놀랍게도 arr_1과 arr_2의 값이 완전히 동일합니다.
보통 rand method는 코드를 실행할 때 마다 다른 숫자를 return하는데
seed method를 사용하면 몇번을 실행해도 동일한 난수를 return하도록 할 수 있습니다.
이것이 seed method의 역할입니다.
이를 더 정확히 이해하려면 random이라는 개념을 컴퓨터가 어떻게 처리하는지를 알아야 합니다.
컴퓨터는 사실 random을 알지 못합니다.
컴퓨터에게 어떠한 숫자를 return해라 라고 하기 위해선 어떠한 input 값들이 있고 이 값들을 더하고 빼고 곱하고 나눠서 최종 결과 숫자를 return하는 것입니다.
그래서 컴퓨터는 random한 숫자를 추출하기 위해 어떠한 시작이 되는 숫자에 뭔가를 더하고 곱하고 나눠서 random한 숫자를 만들어 냅니다.
여기서 첫 단계에 시작이 되는 숫자는 현재 서버 시간, 컴퓨터 시간 등을 사용하는 경우가 많구요.
그리고 이렇게 추출된 random한 숫자를 저장해뒀다가 다음 random 숫자를 추출할 때 쓰기도 하구요.
seed()의 역할은 여기서 말하는 처음 시작 숫자를 결정하는 것입니다.
그래서 seed() method에 전달된 숫자가 동일하다면 그 결과로 나오는 random한 숫자도 동일하게 추출될 수 있는 것이죠.
그러면 seed method의 parameter로 들어가있던 seed=0은 무엇을 의미할까요?
import numpy as np
np.random.seed(seed=0)
arr_1 = np.random.rand(5)
print(arr_1)
np.random.seed(seed=1)
arr_2 = np.random.rand(5)
print(arr_2)
np.random.seed(seed=50)
arr_3 = np.random.rand(5)
print(arr_3)
-- Result
[0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01 1.46755891e-01]
[0.49460165 0.2280831 0.25547392 0.39632991 0.3773151 ]
seed=0은 seed value를 의미합니다.
seed method는 seed value 하나만을 parameter로 받습니다.
seed value가 다르면 random한 숫자를 생성하기 위한 시작 숫자가 달라지기 때문에 rand method로 인해 return되는 숫자도 달라집니다.
위 예시를 보면 seed value를 다르게 설정해놓으니 return되는 숫자들도 달라지죠.
import numpy as np
np.random.seed(seed=1)
arr_1 = np.random.randint(0, 100, size = 3)
print(arr_1)
np.random.seed(seed=1)
arr_2 = np.random.randint(0, 100, size = 3)
print(arr_2)
np.random.seed(seed=10)
arr_3 = np.random.randint(0, 100, size = 3)
print(arr_3)
np.random.seed(seed=10)
arr_4 = np.random.randint(0, 100, size = 3)
print(arr_4)
-- Result
[37 12 72]
[37 12 72]
[ 9 15 64]
[ 9 15 64]
seed method는 randint에도 적용할 수 있습니다.
numpy에서 난수관련 method에는 적용할 수 있다고 보면 됩니다.