이 모듈(패키지)는 다양한 통계분포를 따르는 유사 랜덤수를 생성하는 함수들을 포함합니다. 이전에 부착된 패키지를 사용하기 위해서는
패키지이름.클래스이름.함수이름()
와 같이 사용한다고 했습니다. 물론 이 모듈을 사용하기 위해서는 이 모듈을 부착해야 합니다.
In [1]: import
random
In [2] : random.random()
Out[2]:
0.3741780106878482
In [2] : random.random()
Out[3]:
0.8748210983554208
결과와 같이 random.random() 함수는 0과 1사이의 값(0<x<=1, [1, 0) )에서 무작위로 1개의 수를 반환합니다. 경우에 따라서는 이 무작위로 선택된 수를 이후에도 사용해야 합니다. 이를 위해 그 선택된 수를 지정할 수 있는데 random.seed() 함수를 사용합니다.
In [3] : random.seed(1)
In [4] : random.random()
Out[4]:
0.13436424411240122
즉, 위의 경우 random.seed(1)하에서 작성된 무작위수는 위와 같은 수가 생성됩니다.
In [5] : random.seed(1)
In [6] : random.random()
Out[6]:
0.13436424411240122
random.range(시작, 끝, 간격) 함수는 시작과 끝을 지정한 범위에서는 지정된 간격으로 한 개의 정수형인 랜덤수를 추출합니다. 이 함수의 매개변수 중 간격은 정수이어야 하며 생략이 가능합니다. 주의해야할 점은 파이썬은 0부터 시작하며 범위로 지정된 모든 경우에서 마지막(끝) 수는 포함되지 않는다는 점입니다. 다음은 0과 10사이의(10은 포함되지 않습니다.) 무작위수를 추출하는 명령은 list
comprehesion을 사용합니다.
In [7]: [random.randrange(0,
10) for i in range(10)]
Out[7]: [6, 0, 8,
3, 7, 7, 8, 3, 5, 3]
위의 코드 [7]은 0과 10이전의 정수 사이에서 랜덤수 생성을 10번 반복하기 위한 명령이다. 이 list comprehension은 간단한 반복문 작성을 위해 사용하지만 반복문 다음에 조건문을 첨가할 수 있다.
In [8]: ['goog'
for i in range(10) if random.randrange(0, 10) > 5]
Out[8]: ['goog',
'goog', 'goog', 'goog', 'goog']
random.randrange()와 유사한 함수로 random.randint(a, b)을 사용합니다. 이 함수는 범위 a<=x<=b사이의 임의의 정수 하나를 생성하는 것으로 범위에서 간격을 지정하지 않는 것과 마지막 수가 포함된다는 점이 random.randrange() 함수와의 차이입니다.
In [9]: random.randint(10,
20)
Out[9]: 12
다음으로 이 모듈에서 빈번히 사용되는 함수(메소드)로 random.choice
()와 random.choices()가 있습니다.
random.choice(객체)
객체 중에서 임의의 원소 하나를 반환합니다.
In [10]:
x=[random.randint(1, 100) for i in range(20)]
In [11]: print(x)
[65, 77, 63, 18,
96, 95, 82, 86, 74, 64, 51, 89, 66, 60, 49, 93, 15, 88, 76, 85]
In [12]:
random.choice(x)
Out[12]: 74
In [13]:
random.choice(x)
Out[13]: 66
random.choices(객체, weight=None, cum_weights=None,
k=1)
매개변수 weight를 사용하여 객체 중 각 원소의 가중치를 지정할 수 있습니다. 예를들어 객체의 원소가 [‘a’, ‘b’, ‘c’] 일 경우 가중치를 [10, 5, 3]으로 지정하면 객체의 각 값이 추출될 상대 확률을 지정하는 것과 같습니다. cum_weights는 위의 가중치를 [10, 15, 18]로 표현하는 것입니다. 또는 k는 추출하는 개수를 지정하는 것입니다.
In [14]:
random.choices(x, k=3)
Out[14]: [95, 49,
89]
In [15]:
y=[random.random() for i in range(20)]
In [16]:
random.choices(x, y, k=3)
Out[16]: [15, 93,
64]
random.sample(객체, k)는 random.choices()와 같습니다. 다만 가중치를 지정할 수 없습니다.
In [17]:
random.sample(x, 5)
Out[17]: [15, 95,
74, 49, 65]
In [18]:
random.sample(x, 5)
Out[18]: [89, 82,
85, 88, 86]
또한 sequence 객체의 순서를 임의적으로 바꾸어주는 함수로 random.shuffle(객체)를 사용합니다.
In [19]: print(x)
[48, 17, 8, 89,
96, 25, 55, 32, 48, 22, 21, 86, 81, 52, 33, 80, 24, 53, 73, 63]
In [20]:
random.shuffle(x)
In [21]: print(x)
[63, 89, 32, 53,
24, 33, 48, 81, 8, 73, 22, 86, 25, 52, 55, 17, 21, 96, 48, 80]
In [22]:
random.shuffle(x)
In [23]: print(x)
[96, 8, 17, 48, 81,
86, 73, 22, 52, 53, 48, 63, 89, 24, 55, 32, 25, 80, 33, 21]
임의의 수를 추출하기 위해 “임의수는 정규분포를 따르는 집단에서 추출한다.”와 같이 가이드라인을 설정할 수 있습니다. 통계적으로 표현할 수 있는 분포는 다양하기 때문에 각각의 분포에 따라 그 값을 추출하도록 설정할 수 있는 것이지요. 다음 함수들은 기본적으로 위의 random() 함수와 같지만 추출하는 값들이 지정하는 분포가 정해진다는 차이가 있습니다. 그 기준이 되는 여러 분포들에 대한 소개는 이 책의 범위를 넘어서는 것으로 다른 통계학 서적이나 웹을 참조하세요.
표 8 통계분포에 따른 랜덤수 생성 함수
함수(random.--)
|
설명
|
uniform(a, b)
|
균일분포에서 a<=x<=b에서 실수 하나를 추출
|
Triangular(a,b,mode)
|
대칭분포에서 a<=x<=b에서 실수 하나를 추출. a, b는 각각 0, 1이 기본값이다. mode는 범위사이에 추출할 방식을 지정하는데 중간값이 기본이다.
|
betavariate(alpha,beta)
|
Beta 분포를 기준으로 한다. 이 분포의 모수인 alpha, beta를 인수로 지정하여야 하며 0, 1 사이에서 랜덤수 생성
|
expovariate(lambd)
|
지수분포, lambd는 지수분포의 매개변수
|
gammavariate(alpha, beta)
|
감마분포, 이 분포의 모수값 alpha, beta
|
gauss(mu, sigma)
|
가우스분포, 이 분포의 모수 평균과 표준편차
|
lognormvariate(mu, sigma)
|
로그노말 분포(평균, 표준편차)
|
normvariate(mu, sigma)
|
정규분포, 이 분포의 모수 평균과 표준편차
|
Weibullvariate(alpha, beta)
|
와이블 분포, alpha는 이 분포의 스케일이고 beta는 형태를 나타내는 모수이다.
|
댓글
댓글 쓰기