为什么每次运行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
-
GCC没有正确实现rd.entropy() – 它总是返回0(至less在Mac OS X上)。
-
不幸的是,似乎没有办法将额外的熵混合到random_device中,这很重要,因为它通常/经常(看Linux / dev / random和/ dev / urandom,在Intel RDRAND实现)实现一个伪随机数生成器在引擎盖下。 我希望能够通过注入一些我认为是随机的东西来改善它的输出,而不pipe它的熵源是怎样产生的。 再一次,因为这个设备(或者内核模块)在内部实现了一个encryptionalgorithm来处理熵比特以获得它的输出,所以我希望能够通过注入我自己的数据来与那个设备select的熵。 例如,考虑Java SecureRandom()。 它不允许你设置种子(它确实会把它转换成PRNG),但是它可以很高兴地把你提供的任何东西与它用来“随机化”它的输出的东西混合在一起。
-
我个人比较喜欢RDRAND。 一个紧凑的C接口的小型assembly库。 这里是参考:
英特尔的David Johnson在Stackoverflow解释RDRAND
指向Windows,Linux和Mac OS X的RDRAND库源的Stackoverflow指针
英特尔博客上的RDRAND库,以及一个下载链接