C++ 프로그래밍

C++ Technical Report 1 : Random Number Generation

하늘흐늘 2009. 7. 30. 12:14
반응형

 난수 생성 기능이 굉장히 강력해지고 다양해 졌습니다. 기본적으로 알아야할 상식은 난수라는 것은 진정한 난수가 아닌 일정한 공식(알고리즘)에 의하여 생성되는 수라는 점입니다. 그것은 기존의 C의 방법으로 생성할 때 srand((unsinged int)time(NULL));을 써주지 않을 경우에는 프로그램이 실행될 때마다 매번 같은 난수 값이 반복된다는 것을 통하여 알 수 있습니다.
  TR1은 난수 엔진이라고 불리는 난수 발생 공식을 가진 템플릿 5개를 기본적으로 가지고 있으며 합성 템플릿을 가지고 이들을 조합하여 쓸 수 있습니다. 이런 기본적인 엔진 템플릿을 바탕으로 typedef가 되어 쉽게 쓸 수 있는 클래스가 TR1에 정의되어 있습니다. 그 다음으로 TR1에는 분산(Distribution)을 조정하기 위한 템플릿을 가지고 있습니다. 분산 클래스를 사용하지 않으면 엔진들에서는 모든 수에 대하여 균등하게 난수가 나옵니다. TR1에서는 9개의 분산을 지원합니다. 결과적으로 TR1에서 난수를 만드려면 엔진과 분산을 조합하여 사용하면 됩니다. 간단한 예제는 아래와 같습니다.

// linear congrunetial generator
std::tr1::minstd_rand gen;
// uniform integer distribution

std::tr1::uniform_int<int> dist(0, 9);
// initialize the generator

gen.seed((unsigned int)time(NULL));
// generate the numbers
for(int i = 0; i < 10; ++i)
{
   std::cout << dist(gen) << " ";
}
std::cout << std::endl;

이 글은

Codeguru 'A TR1 Tutorial: Generating Random Numbers'

의 간단한 요약이며 엔진의 공식을 보거나 좀 더 섬세하게 코딩을 하려면 해당 원문을 보시면 됩니다. 하지만 각 랜덤 엔진, 분산 그리고 조합시의 특징을 보려면 다른 글을 찾거나 자신이 직접 테스트해봐야 합니다.

반응형