TraditionalRandom.c (Language : cpp)
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. int main( int argc, char **argv )
  5. {
  6.     srand(time(NULL) );
  7.     for( int i = 0; i < 50; ++i )   {
  8.         printf( "%d\n", rand() % 6 + 1 );
  9.     }
  10.     return 0;
  11. }

  위 구문이 익숙하시죠?? 보통 C/C++을 하시다가 어떠한 난수를 발생시키고자 할 때에 한 번쯤은 써보셨을 겁니다. 그런데 실질적으로 srand 라는 부분도 문제가 되고, % 연산자로 숫자의 범위를 만들어 주어야 하는 단점이 존재합니다. 그 뿐만 아니라 rand() 함수 자체가 short 형인 65536 까지 제한이 걸리다 보니 하고 싶은 작업에 있어서도 제한이 걸립니다. 그런데 역시라고 해야 될지 boost 에는 이런 문제를 해결 해놓은 라이브러리가 존재합니다. 바로 boost::random 입니다.

random.cpp (Language : cpp)
  1. #include <iostream>
  2. #include <boost/tr1/random.hpp>
  3. int main( int argc, char **argv )
  4. {
  5.     //boost::minstd_rand    Random1;
  6.     //boost::minstd_rand0   Random2;
  7.     //boost::mt11213b      Random3;
  8.     boost::mt19937    Random4;
  9.     boost::uniform_int<>    Six( 1, 6 );
  10.     boost::variate_generator< boost::mt19937, boost::uniform_int<> > Dice( Random4, Six );
  11.     for( int i = 0; i < 50; ++i )
  12.         std::cout << Dice() << std::endl;
  13.     return 0;
  14. }

  간단하게 보이죠?? mt19937 같은 부분은 난수발생엔진 부분이고 uniform_int 는 범위와 데이터 형태를 정의하는 부분입니다. varitate_generator 를 이용하여 해당 엔진을 typename 으로 하여 Dice 롤링을 하죠. 그 것을 바로 std::cout 을 이용해 출력하면 콘솔에서 제대로 출력됩니다. 1 ~ 6 의 숫자가 50번 동안 난발적으로 생성됩니다. 뿐만 아니라 boost::uniform_int 대신 boost::uniform_real를 사용하면 실수가 나옵니다. @0@ 많이 편하지 않나요^^. 사용할 곳이 많이 생길지도 모르겠네요.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/03/12 22:18 2008/03/12 22:18

트랙백 주소 :: http://www.filewiki.net/tc/trackback/32

댓글을 달아 주세요

  1. 나쁜남자 2010/08/19 16:01  댓글주소  수정/삭제  댓글쓰기

    많은 도움이 됐습니다.