Why do I get the same sequence for every run with std::random_device with mingw gcc4.8.1?
I use the following code to test the C++ <random>
library.
Why do I get the exact same sequence for every run of the compiled executable? Is rd()
deterministic upon compilation? How do I get different output for each run?
GCC 4.8.1 on Windows 7 64bit. Using MinGW distribution from http://nuwen.net/mingw.html.
EDIT: I tested the same piece code with Visual Studio. There is no problem. The outputs are non deterministic. This could be a bug in mingw gcc 4.8.1 that I used.
#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;
}
From http://en.cppreference.com/w/cpp/numeric/random/random_device:
Note that std::random_device may be implemented in terms of a pseudo-random number engine if a non-deterministic source (e.g. a hardware device) is not available to the implementation.
I would expect a decent implementation to at least seed the RNG though.
Edit: I suspect they deliberately chose to deliver the same sequence each time, to make obvious the fact that the stream wasn't as random as promised.
I got a confirmed answer from STL from MSFT:
Unlike VC, GCC hasn't implemented random_device nondeterministically on Windows. Boost has, so you can use Boost.Random.
You may need to pass a parameter to the constructor:
https://gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/api/a00899.html
This is a GCC bug, fixed in GCC 9.2.
If you have this problem, update your compiler. (You can get a fresh GCC from MSYS2, for example.)