mingw gcc4.8.1을 사용하여 std :: random_device로 실행할 때마다 동일한 시퀀스를 얻는 이유는 무엇입니까?
다음 코드를 사용하여 c++ <random>
라이브러리 를 테스트 합니다.
컴파일 된 실행 파일이 실행될 때마다 정확히 동일한 시퀀스를 얻는 이유는 무엇입니까? 가 rd()
컴파일시에 결정? 각 실행에 대해 다른 출력을 얻으려면 어떻게해야합니까?
Windows 7 64 비트의 GCC 4.8.1. http://nuwen.net/mingw.html 에서 MinGW 배포 사용
편집 : Visual Studio에서 동일한 코드를 테스트했습니다. 문제 없습니다. 출력은 비 결정적입니다. 이것은 내가 사용한 mingw gcc 4.8.1의 버그 일 수 있습니다.
#include <iostream>
#include <random>
using namespace std;
int main(){
random_device rd;
mt19937 mt(rd());
uniform_int_distribution<int> dist(0,99);
for (int i = 0; i< 16; ++i){
cout<<dist(mt)<<" ";
}
cout <<endl;
}
에서 http://en.cppreference.com/w/cpp/numeric/random/random_device :
비 결정적 소스 (예 : 하드웨어 장치)를 구현에 사용할 수없는 경우 std :: random_device는 의사 난수 엔진 측면에서 구현 될 수 있습니다.
그래도 적어도 RNG를 시드하는 적절한 구현을 기대합니다.
편집 : 나는 그들이 의도적으로 매번 동일한 시퀀스를 전달하기로 결정했다고 생각합니다. 스트림이 약속 한만큼 무작위가 아니라는 사실을 분명히하기 위해서입니다.
MSFT 에서 STL에서 확인 된 답변을 받았습니다 .
VC와 달리 GCC는 Windows에서 비 결정적으로 random_device를 구현하지 않았습니다. Boost가 있으므로 Boost.Random을 사용할 수 있습니다.
생성자에 매개 변수를 전달해야 할 수도 있습니다.
https://gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/api/a00899.html
GCC는 rd.entropy ()를 올바르게 구현하지 않습니다. 항상 0을 반환합니다 (최소한 Mac OS X에서는).
안타깝게도 추가 엔트로피를 random_device에 혼합 할 수있는 방법이없는 것 같습니다. 이는 일반적으로 / 자주 (Linux / dev / random 및 / dev / urandom 및 Intel RDRAND 구현에서) 의사 난수 생성기를 구현하기 때문에 중요합니다. 후드. 엔트로피 소스가 생성하는 것과 혼합하기 위해 무작위로 생각하는 것을 주입하여 출력을 향상시킬 수 있기를 바랍니다. 다시 말하지만,이 장치 (또는 커널 모듈) 는 출력을 생성하기 위해 획득 한 엔트로피 비트를 처리 하기 위한 암호화 알고리즘 을 내부적으로 구현하므로 내 데이터를 주입하여 더 많은 처리를 "무작위 화"할 수 있기를 바랍니다. 장치가 선택하는 엔트로피. 예를 들어 Java SecureRandom ()을 고려하십시오. 그것은 당신이 설정할 수 없습니다 시드 (실제로 PRNG로 변환)이지만, 제공 한 내용과 출력을 "무작위 화"하기 위해 사용하는 모든 것을 기꺼이 혼합합니다.
개인적으로 RDRAND를 선호합니다. 컴팩트 한 C 인터페이스가있는 작은 어셈블리 라이브러리입니다. 다음은 참조입니다.
Intel의 David Johnson이 Stackoverflow에서 RDRAND를 설명합니다.
Windows, Linux 및 Mac OS X 용 RDRAND 라이브러리 소스에 대한 Stackoverflow 포인터
'Nice programing' 카테고리의 다른 글
backbone.js를 ASPNET MVC와 통합하는 것이 합리적입니까? (0) | 2020.11.15 |
---|---|
플렉스 컨테이너를 가운데에 맞추고 플렉스 아이템을 왼쪽 정렬하는 방법 (0) | 2020.11.15 |
배열 객체이지만 기본 클래스로 사용할 수없는 이유는 무엇입니까? (0) | 2020.11.15 |
“ImagePullBackOff”를 디버깅하는 방법은 무엇입니까? (0) | 2020.11.15 |
함수 포인터의 역 참조는 어떻게 발생합니까? (0) | 2020.11.15 |