C ++의 난수


12

최근 저는 보통 메르 센 트위스터 (Mersenne Twister) 인 주식 우량 랜덤 생성기를 포함한 현대 언어에 익숙해졌습니다. 이제 C ++로 돌아 왔으므로 사용할 것을 결정해야합니다.

Mersenne Twister 구현을 검색했으며 너무 많은 것이 있음을 발견했습니다. 더 많이 사용되고 널리 사용되는 것이 있습니까? 아니면 모두 똑같이 좋다고 가정합니까?


1
나는 당신이 C ++과 현대 언어를 분리하는 것을 좋아합니다.
jcora

2
"높은 수준"이라고 말하는 것이 더 적절했을 것입니다.
o0 '.

나는이 질문이 stackoverflow에 속해 있다고 생각합니다
TravisG

5
그래서 나는 의료 요법에 대한 몬테 카를로 시뮬레이션과는 달리 게임 엔진에 대한 것인지 알지 못했기 때문에 다른 대답을 할 것입니다.

답변:


19

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;

5
그래, 내가 찾던 그런 종류의 대답이야, 그래서 내가 gamedev에 게시 한 이유 :)
o0 '.

1
링크 한 파일에서 공개 도메인에 있음을 나타내는 것은 없습니다. 법이 기본적으로 "모든 권리 보유"를 가정하기 때문에 저작권법이 작동하는 방식에 대한 명확한 메모가 필요합니다. 일부 관할 구역에서는 기본적으로 "이것은 공개 도메인에 있음"을 법적 구속력으로 인정하지 않기 때문에 실제로 MIT 또는 BSD 2 절 라이센스와 같은 것을 사용하는 것이 더 안전합니다. 사람들이 귀하의 코드를 사용하는 것을보고 싶으면이를 처리하는 것이 좋습니다.
Sean Middleditch

1
@ seanmiddleditch : 나는 여기에 대해 분명하고 있습니다. MIT 스타일 라이센스 하에서 원하는 경우 SQLite의 리드에 따라 1000 달러에 제공합니다.

코드에서 헤더 (SQLite 가하는 iirc)를 선언하는 것이 주요 문제 인 경우 부족합니다. 신경 쓰지 않으면 멋지다. 당신에게 친절한 제안을하고있었습니다.
Sean Middleditch 2014 년

1

gamedev 목적으로 이전에 사용한 또 다른 RNG는 여기 에 설명 된 Bob Jenkins의 "작은"RNG 입니다.

(그는 또한 ISAAC라는 암호화 강도 RNG를 가지고 있지만 더 크고 느리며 게임에는 그 정도의 강도가 필요하지 않습니다.)


1
이는 xorshift (4 xors 및 3 shift vs. 4 adds, 6 shifts, 2 ors 및 xor)보다 비싸며 기간이 더 나쁘고 특정 초기화로 매우 짧은 사이클의 위험이 있습니다. 빠르지 만 빠르지는 않습니다. 괜찮은 기간이지만 최적의 곳은 없습니다. xorshift와 동일한 기본 분포 품질; 그것을 사용해야 할 이유가 없습니다.

그럴 수 있지. 분포 및 사이클 속성을 파헤칠 RNG 분석에 대해 충분히 알지 못합니다.
Nathan Reed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.