我使用以下代码测试C++ <random>
库。
为什么每次运行编译后的可执行文件都会得到完全相同的序列?rd()
在编译时是确定性的吗?如何在每次运行中获得不同的输出?
64位Windows 7上的GCC 4.8.1。使用来自http://nuwen.net/mingw.html的MinGW发行版。
编辑:我用Visual Studio测试了同样的代码。没有问题。输出是不确定的。这可能是我使用的名为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;
}
发布于 2013-09-19 03:28:57
来自http://en.cppreference.com/w/cpp/numeric/random/random_device
注意,如果不确定性源(例如,硬件设备)对于实现不可用,则可以按照伪随机数引擎来实现std::random_device。
不过,我希望一个好的实现至少能为RNG提供种子。
编辑:我怀疑他们故意选择每次发送相同的序列,以清楚地表明流并不像承诺的那样随机。
发布于 2013-09-20 10:43:49
我从STL from MSFT那里得到了一个肯定的答案
与VC不同的是,GCC并没有在Windows上不确定性地实现random_device。Boost有,所以你可以使用Boost.Random。
发布于 2014-09-16 13:42:49
您可能需要向构造函数传递一个参数:
https://gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/api/a00899.html
https://stackoverflow.com/questions/18880654
复制相似问题