Post List

2015년 4월 21일 화요일

C++11의 random

C++11의 random 기능에 대해서 소개를 해 드리도록 하겠습니다.

* C++98 에서의 random 생성 방법

// C++98
srand((int)time(0));
int randNum01 = rand(); // whole range
int randNum02 = rand() % 101; // 0 ~ 100
std::cout << randNum01 << " : " << randNum02 << std::endl;

위의 예제와 같이 사용하였습니다.
C-runtime 함수를 이용하였으며, 전역 함수를 사용했으므로,
각종 병렬화 기능을 이용해서 동시에 생성이 힘들었으며,
따로 선언하여 병렬로 실행을 했을 경우, 분포가 균등하게 되지 않게 되었습니다.

* C++11의 random 소개

- 해더 파일
#include <random>

C++11의 random 기능은 2부분으로 분리되어 있습니다.

- 난수 생성기 (random generator) : 어떻게 생성할 것인가 ?
- 난수 분포기 (random distribution) : 어떤 타입으로 어느 범위로 할 것인가 ?

를 사용자가 조합하여 사용하시면 됩니다.
전체적인 난수 생성기와 분포기의 종류는 아래 Link를 참조하시면 됩니다.

http://www.cplusplus.com/reference/random

여기에서는 바로 사용 가능한 예제 하나를 소개해 드리는 것으로 마치겠습니다.

* -100 에서 100 사이의 정수 random 생성

// int random -100 to 100
auto currentTime = std::chrono::system_clock::now();
auto duration = currentTime.time_since_epoch();
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();

std::mt19937_64 randomGen(millis);
std::uniform_int_distribution<__int64> randomDist1(-100, 100);

std::cout << "randomDist1 Min Value : " << randomDist1.min() << std::endl;
std::cout << "randomDist1 Max Value : " << randomDist1.max() << std::endl;
for (int i = 0; i < 10; i++)
{
        std::cout << randomDist1(randomGen) << " : ";
}
std::cout << std::endl;

이것 말고도 normal_distribution으로는 정규 분포의 random 생성이 가능하며,
쁘아송 분포 등 실제로 쓸만한 분포기가 많으니,
위의 reference link를 확인하시면 됩니다.