참고사이트
http://www.boost.org/doc/libs/1_36_0/libs/random/index.html
예제소스
#include <iostream>
#include <random>
#include <windows.h>
using namespace std;
using namespace std::tr1;
void main()
{
mt19937 Generator; //난수엔진
uniform_int<> dst(100, 500); //범위지정자
Generator.seed(GetTickCount()); //seed 초기화
variate_generator<mt19937, uniform_int<> > rand(Generator, dst); //난수생성기
for( int i = 0;i < 1000; ++i )
{
cout << rand() << endl; //난수생성기는 () 연산자를 난수생성 연산자로 오버로딩 해 놓았습니다.
}
}
TR1의 난수생성기는 3개의 요소로 이루어집니다.
1. 난수엔진
2. 범위지정자
3. 난수생성기
난수 엔진은 여러가지가 있으며, 대충 아래와같습니다.
정수난수엔진
minstd_rand
rand48
lrand48 (C 기본 라이브러리와 같음)
ecuyer1988
kreutzer1986
hellekalek1995
mt11213b
mt19937(C++0X 기본 난수엔진)
실수난수엔진 (전부 lagged_fibonacci 시리즈군요)
lagged_fibonacci607
lagged_fibonacci1279
lagged_fibonacci2281
lagged_fibonacci3217
lagged_fibonacci4423
lagged_fibonacci9689
lagged_fibonacci19937
lagged_fibonacci23209
lagged_fibonacci44497
아래로 갈 수록 랜덤의 성능이 좋아지지만, 메모리소모가 커지고 속도가 느려집니다.
만약 _HAS_CPP0X_ 매크로가 정의되어있다면,
mt19937엔진은 default_random_engine 라는 이름으로 typedef 됩니다.
Ps1. C++0X 표준에서는 variate_generator<mt19937, uniform_int<>> 처럼 템플릿의 >>를 붙여쓰는것을 허용합니다.
하지만 C++0X이전의 컴파일러에서는 >>를 시프트 연산자로 인식하여 오류를 내니 주의.
VS2008 Sp1은 >>를 정상적으로 템플릿으로 인식하며 CB2009는 오류를 냅니다.
Ps2. 현재 mt19937엔진은 VS2008 SP1 에서 범위밖의 숫자를 뱉어내는 치명적인 버그를 가지고 있으니 주의하세요
(김호광님 감사합니다)