Boost Random Number Generator Library

Boost Library의 랜덤함수를 사용하여 난수를 생성하는 방법에 대해 알아봅시다.


보통 C언어에서 난수를 만든다고 하면, rand()/srand()를 사용하셨을겁니다. 좀 더 덧붙여서 time.h를 include하여 time까지 썼던 사람들도 아마 대부분일 것입니다.


먼저 Boost Documentation에 적혀있는 랜덤함수에 대해 적어봤습니다.


난수는 다음과 같이 다양하면서 다른 문제영역 해결을 위해 개발되었습니다.


1. 계산 (시뮬레이션, 몬테칼로리 적분)

2. 게임 (적의 움직임)

3. 보안 (건생성)

4. 테스트 (무작위한 화이트 박스 테스트)


문제영역의 요구에 따른 난수 생성자의 다양한 변화.


1. 비결정적 난수생성자

2. 의사결정 난수생성자

3. 준 난수생성자


랜덤함수 라이브러리 개발 목표


1. Third-Party(제 3자 회사)에서 개발한 라이브러리 등과 난수생성자의 쉬운 결합

2. 생성자의 타당성을 검증하는 인터페이스 정의

3. 분산처리를 모방하는 간이한 Front-end Class 제공

4. 최대한의 효율성

5. Front-end 처리에 있어서 양자화 효과를 조작할 수 있음



Boost에서 난수를 생성하는 함수는 여러가지가 있으며 random.hpp를 include합니다.


난수 생성기 퍼포먼스 비교 

(출처 : http://cafe.naver.com/devrookie)


1. rand48 : 0.096

2. rand48 run-time configurable : 0.697

3. lrand48 glibc 2.1.2 : 0.844

4. minstd_rand : 0.174

5. ecuyer1988 : 0.445

6. kreutzer1986 : 0.249

7. hellekalek1995 (inversive) : 4.895

8. mt11213b : 0.165

9. mt19937 : 0.165

10. mt19937 original : 0.185

11. lagged_fibonachi607 : 0.111

12. lagged_fibonachi4423 : 0.112

13. lagged_fibonachi19937 : 0.113

14. lagged_fibonachi23209 : 0.122

15. lagged_fibonachi44497 : 0.263


그럼 코드를 한 개 짜보도록 하지요..


#include <iostream>

#include <boost/random.hpp>

using namespace std;

using namespace boost;

int main()

{

rand48    dl;

uniform_int<>    kid(1,100);

variate_generator < rand48, uniform_int<> rand(dl, kid);


for(int i=0;i<20;i++)

cout << rand() << ' ';


return 0;

}


위 코드는 rand48 함수를 사용하여 난수를 생성한 방법입니다. 1,100까지 아무 숫자나 뽑아서 20개의 숫자를 출력하는 방법입니다. 더 나아가서 time 함수를 쓴다면 프로그램 실행할 때마다 숫자가 바뀌겠지요? 처음부터 설명해보자면, 먼저 난수 발생기 하나를 정해줍니다. rand48을 정해줬지요. 그 다음 int면 int, double이면 double 등 자료형을 정해 랜덤으로 뽑아올 숫자의 범위를 지정해줍니다. 여기서는 1에서 100까지를 지정해줬지요. 중간과정이 빠져있지만 나중에 seed라는 값을 멤버함수로 넘겨줘서 쓰는 방법이 있는데, 여기서는 빠진 상태입니다. 만들어준 generator와 범위를 variate_generator (여기서는 using namespace를 사용)로 전달하여 마지막으로 출력을 하였습니다.


그 외에도 여러 함수를 사용하여 난수를 생성하는 방법이 있으니 참고하셔서 사용해보시기 바랍니다.





TAGS.
comments powered by Disqus

Tistory Comments 0