최근 저는 보통 메르 센 트위스터 (Mersenne Twister) 인 주식 우량 랜덤 생성기를 포함한 현대 언어에 익숙해졌습니다. 이제 C ++로 돌아 왔으므로 사용할 것을 결정해야합니다.
Mersenne Twister 구현을 검색했으며 너무 많은 것이 있음을 발견했습니다. 더 많이 사용되고 널리 사용되는 것이 있습니까? 아니면 모두 똑같이 좋다고 가정합니까?
최근 저는 보통 메르 센 트위스터 (Mersenne Twister) 인 주식 우량 랜덤 생성기를 포함한 현대 언어에 익숙해졌습니다. 이제 C ++로 돌아 왔으므로 사용할 것을 결정해야합니다.
Mersenne Twister 구현을 검색했으며 너무 많은 것이 있음을 발견했습니다. 더 많이 사용되고 널리 사용되는 것이 있습니까? 아니면 모두 똑같이 좋다고 가정합니까?
답변:
C ++ 11에는 기본적으로 Mersenne Twister 생성기가 새로운 <random>
인터페이스의 일부로 포함되어 있습니다. 예를 들어 MT를 사용하여 [-10, 10] 사이의 정수를 균일하게 생성하려면 다음을 수행하십시오.
std::mt19937 eng; // This is the Mersenne Twister
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;
이름이 약간 다르지만 대부분 TR1을 제공하는 모든 컴파일러에서 사용할 수 있습니다. std::tr1::mt19937
그리고 std::tr1::uniform_int<int>
.
나는 보통 사람들이 Mersenne Twister를 사용하지 않도록주의합니다. 괜찮은 알고리즘이지만 많은 인기가 마케팅 일뿐입니다. 랜덤의 624 차원은 대부분의 사람들이 필요로하는 것 이상이며 MT는 상대적으로 무거운 상태 요구 사항을 수행하며 전체 테이블 재 계산을 수행하면 캐시를 날릴 수 있습니다. 나는 xorshift에 개인적으로 부분적 이므로 작은 메모리 및 CPU 요구 사항으로 게임에 필요한 모든 것에 대해 우수한 기간과 합리적인 배포를 제공합니다.
나는 (주로?) C ++ 11 호환 xorshift 생성기 xorshift.hpp , xorshift.cpp 을 작성하여 공개 도메인에 배치했습니다. 위와 같이 C ++ 11 임의 화 함수에이를 연결할 수 있습니다.
xorshift eng;
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;
gamedev 목적으로 이전에 사용한 또 다른 RNG는 여기 에 설명 된 Bob Jenkins의 "작은"RNG 입니다.
(그는 또한 ISAAC라는 암호화 강도 RNG를 가지고 있지만 더 크고 느리며 게임에는 그 정도의 강도가 필요하지 않습니다.)