为什么我使用mingw gcc4.8.1使用std :: random_device进行每次运行都会得到相同的序列?

aha*_*ala 66 c++ random stl c++11

我使用以下代码来测试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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 32

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

注意,如果非确定性源(例如,硬件设备)对于实现不可用,则可以根据伪随机数引擎来实现std :: random_device.

我希望有一个不错的实现,至少可以为RNG播种.

编辑:我怀疑他们每次故意选择提供相同的序列,以明确表明流不像承诺的那样随机.

  • 真正的失败是首先将这种伪随机回退. (17认同)
  • 我同意.stdlibc ++的后备实现使用了一个常量种子,这并没有让我觉得那么聪明(而且没有解释). (10认同)
  • @ypnos:标准必须做一些事情来覆盖确定性平台上的C++实现.但在真实平台上这样做是一个巨大的实施质量问题.另请参见[如何简洁,便携,彻底地播种mt19937 PRNG?](/sf/ask/3154845361/) . (5认同)

aha*_*ala 24

从MSFT获得了STL的确认答复:

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


Hol*_*Cat 6

这是一个GCC bug,已在 GCC 9.2 中修复。

如果您遇到此问题,请更新您的编译器。(例如,您可以从 MSYS2 获取新的 GCC。)