코딩&알고리즘/코딩

Python - Random Numbers (2)

이툐툐 2022. 3. 11. 20:47

이전에 글에서는 random.seed에 대해 얘기를 했었다. 이 글에서는 이 seed란 무엇인가에 대해 정리하도록 하겠다. 

같은 seed면 같은 수가 나온다고 했는데, for loop에서 어떻게 달라지는지 확인해보자.

1. for loop 1개 

먼저 다음처럼 for loop이 하나 있는 식은 몇백번을 실행해도 결과가 같을 것이다.

import numpy as np

np.random.seed(123)
arr = []
for i in range(10):
	arr.append(np.random.randint(0, 5))
print(arr)

2. for loop이 2개 이상인 경우

그럼 같은 seed에 같은 순서는 같은 숫자를 얻을 수 있다고 생각할 수 있다. 하지만 중요한 건 이건 seed 호출 뒤의 딱 한 개의 for loop이 있을 때만 참이 되는 것이다. 다음과 같이 for loop이 2개인 경우를 살펴보자

import numpy as np

np.random.seed(123)

arr = []
for i in range(10):
	arr.append(np.random.randint(0, 5))
print("첫번째 : ", arr)

arr = []
for i in range(10):
	arr.append(np.random.randint(0, 5))
print("두번째 :", arr)

이제 우리는 첫번째와 두번째 값이 다른 것을 확인할 수 있다. 

 seed() 호출 후 for loop 을 한다면?

다음과 같이 두번째 for loop 전에 np.random.seed(123)을 한번 더 써주면 1번째나 2번째의 결과가 같아진다. seed 호출 뒤의 첫번째 for loop이기 때문에 결과가 같은 것이라 할 수 있다.

import numpy as np

np.random.seed(123)

arr = []
for i in range(10):
	arr.append(np.random.randint(0, 5))
print("첫번째 : ", arr)

np.random.seed(123)
arr = []
for i in range(10):
	arr.append(np.random.randint(0, 5))
print("두번째 :", arr)

이를 이용해 나오는 값에 대해 히스토그램을 그릴 수 있다. 다음은 내부 for loop에서 만든 랜덤 숫자 배열 중 가장 마지막에 있는 요소들만 저장한 결과를 히스토그램으로 그려본 것이다. 내부 for loop에서는 먼저 random 숫자 c를 생성하고(c = np.random.randint(0, 2)) 그걸 arr2라는 배열에 저장한다. 대신 이 코드에서 저장할 때, 그 전에 있는 숫자와 합한 값을 저장하도록 하였다.(arr2.append(arr2[i]+c)) 만약 2번째 c를 만들고 여태 만들어진 arr2 = [0, 2, 3]이라고 한다면 arr2[3] = arr2[2] + c = 3 + c 가 만들어진다. 

arr2[-1]은 arr2 배열의 가장 마지막 요소를 뜻한다.

np.random.seed(123)
arr = []
for i in range(100):
    arr2 = [0]
    for i in range(10):
        c = np.random.randint(0, 2)
        arr2.append(arr2[i]+c)
    arr.append(arr2[-1])

print(arr)
plt.hist(arr, bins = 10)
plt.show()

결과는 다음과 같다. 

Histogram

 

'코딩&알고리즘 > 코딩' 카테고리의 다른 글

Python - Random Numbers (1)  (0) 2022.03.11
Python - Loop Data Structure 정리 (1)  (0) 2022.03.11