<random>실제 프로그램에서 C ++ 기능 을 사용하려고한다고 가정합니다 ( "실제"에 대한 정의 – 여기서 제약은이 질문의 일부 임). 대략 다음과 같은 코드가 있습니다.
int main(int argc, char **argv) {
int seed = get_user_provided_seed_value(argc, argv);
if (seed == 0) seed = std::random_device()();
ENGINE g(seed); // TODO: proper seeding?
go_on_and_use(g);
}
내 질문은, 어떤 유형을 사용해야 ENGINE합니까?
나는
std::mt19937타이핑하는 것이 빠르고 이름을 인식했기 때문에 항상 말했었습니다. 그러나 요즘 Mersenne Twister는 매우 무겁고 캐시에 친숙하지 않으며 다른 사람들이하는 모든 통계 테스트를 통과하지 못한다고 말하는 것처럼 보입니다 .std::default_random_engine명백한 "기본"이기 때문에 말하고 싶습니다 . 하지만 플랫폼에 따라 다릅니다 나도 몰라, 그리고 통계적으로 어떤 좋은 모르겠어요.모든 사람들이 요즘 64 비트 플랫폼이기 때문에, 우리는 적어도 사용되어야합니다
std::mt19937_64이상std::mt19937?내가 말하고 싶은
pcg64또는xoroshiro128그들이 존경하고 가벼운 것 때문에,하지만 그들은 존재하지 않는<random>전혀.나는 대해 아무것도 모르는
minstd_rand,minstd_rand0,ranlux24,knuth_b확실히 그들이 뭔가 좋은해야한다 - 등?
분명히 여기에는 경쟁 제약이 있습니다.
엔진의 힘. (
<random>암호 적으로 강력한 PRNG는 없지만 여전히 표준화 된 일부는 다른 것보다 "약한"것입니다.)sizeof엔진.그것의 속도
operator().파종의 용이성.
mt19937초기화 할 상태가 너무 많기 때문에 제대로 시드하기 어려운 것으로 악명이 높습니다.라이브러리 공급 업체 간의 이식성 한 공급 업체가
foo_engine다른 공급 업체와 다른 번호를 생성하는 경우foo_engine일부 응용 프로그램에는 적합하지 않습니다. (이것은 아마도을 제외하고 아무것도 배제하지 않기를 바랍니다default_random_engine.)
이러한 모든 제약 조건을 최대한 잘 평가 한 후에 궁극적 인 "표준 라이브러리에 머무는 가장 좋은 방법"은 무엇입니까? 그냥 계속 사용해야합니까 std::mt19937, 아니면 무엇입니까?