2014-11-16 8 views
4

C++ 11에서는 mt19937과 같은 의사 난수 생성기를 사용하거나 사용하지 않고 std::random_device을 사용하여 숫자를 생성 할 수 있습니다.std :: random_device와 pRNG를 사용하는 것의 차이점은 무엇입니까? 표준 : : mt19937과없이?

#include <random> 
#include <iostream> 

int main() { 
    std::random_device rd; 
    std::mt19937 mt(rd()); 
    std::uniform_real_distribution<double> dist(1, 10); 

    for (int i=0; i<16; ++i) 
     std::cout << dist(rd) << "\t" << dist(mt) << "\n"; 
} 
+2

http://en.cppreference.com/w/cpp/numeric/random/random_device –

답변

4

std::random_devicemt19937 같은 엔진을 위해 당신에게 씨앗을 얻을 것으로 예상되는 :

이 모범 코드에서이를 사용하여 차이가 될 것입니다 무엇. 생성 된 연속적인 숫자의 품질은 완전히 정의되지 않았으며 실용적인 목적 (예 : 암호화)으로는 충분하지 않을 수 있으므로 이에 의존하는 것은 의문의 여지가 있습니다.

이외에도 mt19937은 동일한 시드가 주어지면 동일한 시퀀스를 제공합니다. random_device 값은 생성자에게 주어진 문자열에 의해서만 영향을받을 수 있습니다. 이는 구현 정의 동작을 의미합니다.

1

는 내가 아는이 개 차이가 있습니다 빠르지 만 덜 안전한 암호화됩니다 mt199937를 사용

  1. .
  2. std::random_device 당신이 항상 같은 임의의 숫자 당신에게 줄 것이다 상수 씨와 mt19937를 초기화하면 항상 무작위하지만 것

    std::mt19937 mt(2014);

랜덤 비트의 동일한 순서를 줄 것이다 때마다. 특정 동작을 반복해서 테스트하려는 경우 유용 할 수 있습니다. 이 표준은 26.5.5/4이 필요합니다

필요한 행동 : 유형 mt19937의 기본 건설 한 개체의 1만번째 연속 호출이 4123659995.

이 더있다 값을 작성해야한다 그러한 동등한 일관성은 std::random_device입니다.

+0

"표준에서는 26.5.5/4에서 * this *가 필요합니다."- 아닙니다 ... –

+0

@KarolyHorvath 예, 기술적으로 만 디폴트 건설을 위해, 그러나 그것은'random_device'에 대한 모든 요구 사항이 아니며, 그것은 제가 prng에 대해 볼 수있는 유일한 것입니다 ... – Barry

+0

그리고 하나의 값만 언급합니다. 기묘한. (참고 : 당신은'mt19937'을 의미했습니다). –