더 정밀한 랜덤값을 얻기위한 팁
컴퓨터공학/코딩팁 2011. 5. 14. 16:41
C언어차원에서 제공하는 rand()함수는 그 정밀도가 상당히 낮다.
최대한 랜덤값주기를 높여서 사용하는 방법이 있긴하지만, 그래도
고성능을 요하는 게임이나 그래픽, 랜덤검색알고리즘등에는 무리가있다.
rand() 를 대체할 알고리즘으로는 XOR-Shift, Mersenne Twister 정도가 있다.
Mersenne Twister는 2^{19937}-1 라는 어마어마한 주기를 같는 랜덤값을 생성해 낸다.
visual studio 2010 에서는 기본라이브러리로 제공하고있다.
Mersenne Twister의 구체적인 사용예를 살펴보자.
( vs2010이 아닌 vs6.0, vs2007, vs2008 을 사용하는 경우는 boost 라이브러리를 설치, 링크하여 사용할 수 있다 )
먼저, Mersenne Twister 를 사용하기 위해 관련라이브러리를 추가한다.
그리고, 아래와같은 초기화를 수행한다.
시드값이나 동작환경(32bit, 64bit)등의 설정등은 보통 디폴트로 괜찮다.
여기서 10.0과 10.0은 랜덤값의 발생범위이다. (경계값은 포함이다. [-10.0, 10.0] )
그리고, 위의 예에서는 double 타입의 랜덤값을 생성하고 있지만 int 형의 랜덤값 발생은
uniform_real_distribution 대신에 uniform_int_distribution 로 바꿔주면 된다.
최대한 랜덤값주기를 높여서 사용하는 방법이 있긴하지만, 그래도
고성능을 요하는 게임이나 그래픽, 랜덤검색알고리즘등에는 무리가있다.
rand() 를 대체할 알고리즘으로는 XOR-Shift, Mersenne Twister 정도가 있다.
Mersenne Twister는 2^{19937}-1 라는 어마어마한 주기를 같는 랜덤값을 생성해 낸다.
visual studio 2010 에서는 기본라이브러리로 제공하고있다.
Mersenne Twister의 구체적인 사용예를 살펴보자.
( vs2010이 아닌 vs6.0, vs2007, vs2008 을 사용하는 경우는 boost 라이브러리를 설치, 링크하여 사용할 수 있다 )
먼저, Mersenne Twister 를 사용하기 위해 관련라이브러리를 추가한다.
그리고, 아래와같은 초기화를 수행한다.
시드값이나 동작환경(32bit, 64bit)등의 설정등은 보통 디폴트로 괜찮다.
여기서 10.0과 10.0은 랜덤값의 발생범위이다. (경계값은 포함이다. [-10.0, 10.0] )
그리고, 위의 예에서는 double 타입의 랜덤값을 생성하고 있지만 int 형의 랜덤값 발생은
uniform_real_distribution 대신에 uniform_int_distribution 로 바꿔주면 된다.
'컴퓨터공학 > 코딩팁' 카테고리의 다른 글
boost 라이브러리의 랜덤함수이용 (0) | 2011.05.18 |
---|---|
[C++ STL] vector(벡터) erase 함수 제대로 사용하기 (0) | 2011.05.15 |
double형의 최대값 최소값 (0) | 2011.05.14 |
램덤값 관련 함수 라이브러리 (0) | 2011.05.11 |
배열을 인수로 받는 함수내에서 sizeof 가 제대로 작동하지 않는 이유에 대하여 (0) | 2011.03.07 |