난수 Random
동전을 던지거나, 주사위를 굴리거나 카드를 섞는 등의 행동은 우리가 '진짜(Truly)' 난수라고 할 수 있지만, 매번 이러한 시행을 통해 난수를 추출하는 것은 너무 오래 걸린다.
따라서, 컴퓨터는 난수를 흉내낸 난수를 만들게 된다. 다시말해, 정말 확률적으로 만들어진 난수가 아닌 일종의 계산을 통해서 난수를 만든 것이다.
컴퓨터의 난수는 두가지 개념으로 나눌 수 있다. Pseudo-Random과 Quassi-Radom이다.
Pseudo[유사] random은 그 어원대로 난수를 흉내내는 수이다. 따라서 실제로는 규칙을 가지고 있지만, 일반적으로 사람은 규칙에 따라 발생되는 수들을 통해 그 규칙을 추정해 낼 수 없다.
난수발생의 알고리즘 2가지
1. mid-square
우리가 1195라는 숫자를 만들어 냈다면 이를 이용해 다음과 같은 수들을 얻을 수 있다.
9306 ** 2 = 86601636 --> 6601
6601 ** 2 = 43573201 --> 5732
이런식으로 숫자를 만들어 낼 수 있다.
2. 시간을 이용한 계산
년도: $YY$ 달: $MM$ 날짜: $DD$ 시간: $HH$ 분: $Min$ 초: $SS$
$$X_{0} = YY + 100 * (MM - 1 + 12 ( DD - 1 + 31 ( HH + 24 ( Min + 60 * SS) ) ) ) $$
이렇게 첫 수를 만들어놓고 곱하고 나누는 등 복잡한 계산을 통해 난수들을 만들어 낼 수 있다.
이렇게 만들어진 난수들은 정말 무작위 확률로 만들어 지지는 않았지만, 사람들이 그 규칙을 추정할 수 없는 가짜 난수라고 할 수 있다.
Quassi Random은 난수들의 분포가 진짜 난수들 보다 뭉쳐지지 않고 더욱 흩뿌려져(scatter)있다. 이에 반해일반적인 pure-random은 우리가 생각하는것보다 더욱 밀집(clump)되어 있다고 한다.
자세한 내용:
www.johndcook.com/blog/2009/03/16/quasi-random-sequences-in-art-and-integration/
Python Random
C와 Java는 Uniform(0,1) 난수만을 제공하지만, 파이썬에서는 numpy module로 다양한 종류의 난수를 제공한다.
1. np.random.binomal(n,p,size)
binomial , 이항분포로 부터의 난수를 추출 한다.
예를들어 np.random.binomal(4, 0.5, 10)이면,
1. $ [x_{11}, x_{12}, x_{13}, x_{14} ], [x_{21}, x_{22}, x_{23}, x_{24}] , \cdots , [x_{101}, x_{102}, x_{103}, x_{104}] $ 가 생성된다.
2. 각 $x_{nk}$ 는 확률로, uniform(0,1)을 따른다.
3. 설정한 p = (0.5) < $x_{nk}$ 면 1, 작으면 0으로 변환한다.
4. $x_{n}$의 1개수를 결과 array에 담아준다. 만약 $ [x_{11}, x_{12}, x_{13}, x_{14} ]$ = [ 0.3, 0.7, 0.2 , 0.6] 이고,
$[ x_{101} , x_{102} , x_{103} , x_{104} ]$ = [0.2, 0.1, 0.1, 0.9] 면 , 결과 array = $[ 2, \cdots , 1]$이 될 것이다.
2. np.random.normal(loc = 0 , scale = 1, size)
정규분포 (normal distribution, gaussian (error) distribution)로부터 난수를 추출한다.
loc : 평균(default = 0) , scale : 편차(default = 1) , size : (default =1)
import numpy as np
a = np.random.normal(size = 10)
print(a)
b = np.random.normal(size = (2,3))
print(b)
c= np.random.normal(2)
print(c)
d = np.random.normal(3,1)
print(d)
e = np.random.normal()
print(e)
결과:
a : [-0.0662154 -0.5102916 -0.59993605 1.56478093 0.1752238 -0.89175976 -1.58152801 0.04773538 0.27007436 0.60264913]
b: [[-0.24803753 -0.70575899 1.42220667] [ 0.01547999 -1.08569416 0.23873837]]
c: 2.7509245345942537
d: 2.6924056417180506
e: -1.2679808183779744
'Study > Python' 카테고리의 다른 글
Python OLS Model Summary (0) | 2020.10.28 |
---|---|
파이썬 가상환경 tf1.x버전 다운로드 파이참 연결 (0) | 2020.10.20 |
1. 계산기 만들기 (1) | 2020.10.13 |