为什么每次运行std :: random_device和mingw gcc4.8.1都得到相同的序列?

我使用下面的代码来testingc++ <random>库。

为什么每次运行编译的可执行文件都得到完全相同的序列? rd()在编译时是确定的吗? 每次运行如何获得不同的输出?

在Windows 7 64bit上的GCC 4.8.1。 使用来自http://nuwen.net/mingw.html的 MinGW发行版

编辑:我用Visual Studiotesting了相同的代码。 没有问题。 输出是不确定的。 这可能是在我使用的mingw gcc 4.8.1中的一个bug。

 #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可以用一个伪随机数引擎来实现。

我期望一个体面的实施,至less种子RNG虽然。

编辑:我怀疑他们故意select每次交付相同的序列,以显而易见的事实,该stream是不是像承诺的随机。

我从MSFT得到了STL的确认答复:

与VC不同,GCC在Windows上还没有实现random_device的确定性。 Boost有,所以你可以使用Boost.Random。

您可能需要将parameter passing给构造函数:

https://gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/api/a00899.html

  1. GCC没有正确实现rd.entropy() – 它总是返回0(至less在Mac OS X上)。

  2. 不幸的是,似乎没有办法将额外的熵混合到random_device中,这很重要,因为它通常/经常(看Linux / dev / random和/ dev / urandom,在Intel RDRAND实现)实现一个伪随机数生成器在引擎盖下。 我希望能够通过注入一些我认为是随机的东西来改善它的输出,而不pipe它的熵源是怎样产生的。 再一次,因为这个设备(或者内核模块)在内部实现了一个encryptionalgorithm来处理熵比特以获得它的输出,所以我希望能够通过注入我自己的数据来与那个设备select的熵。 例如,考虑Java SecureRandom()。 它不允许你设置种子(它确实会把它转换成PRNG),但是它可以很高兴地把你提供的任何东西与它用来“随机化”它的输出的东西混合在一起。

  3. 我个人比较喜欢RDRAND。 一个紧凑的C接口的小型assembly库。 这里是参考:

    英特尔的David Johnson在Stackoverflow解释RDRAND

    指向Windows,Linux和Mac OS X的RDRAND库源的Stackoverflow指针

    英特尔博客上的RDRAND库,以及一个下载链接