我需要一些随机数进行模拟,并使用nuwen.net的MinGW Distro试验C ++ 11随机库。
正如其他几个主题中所讨论的那样,例如Why do I get the same sequence for every run with std::random_device with mingw gcc4.8.1?,random_device不生成随机种子,即下面的代码,用GCC编译,为每次运行生成相同的数字序列。
// test4.cpp
// MinGW Distro - nuwen.net
// Compile with g++ -Wall -std=c++14 test4.cpp -o test4
#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;
}
运行1:56 72 34 91 0 59 87 51 95 97 16 66 31 52 70 78
运行2:56 72 34 91 0 59 87 51 95 97 16 66 31 52 70 78
为了解决这个问题,建议使用boost库,然后代码看起来如下所示,从How do I use boost::random_device to generate a cryptographically secure 64 bit integer?和A way change the seed of boost::random in every different program run采用,
// test5.cpp
// MinGW Distro - nuwen.net
// Compile with g++ -Wall -std=c++14 test5.cpp -o test5
#include <boost/random.hpp>
#include <boost/random/random_device.hpp>
#include <iostream>
#include <random>
using namespace std;
int main(){
boost::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;
}
但是这段代码不会编译,给出错误“未定义引用'boost :: random :: random_device :: random_device()”。请注意,includes.hpp和radndom_device.hpp都可以在include目录中找到。任何人都可以建议代码或编译有什么问题吗?
答案 0 :(得分:0)
将代码链接到boost库 libboost_random.a 和 libboost_system.a 似乎解决了这个问题,可执行文件为每次运行生成了不同随机数的列表。
// test5.cpp
// MinGW Distro - nuwen.net
// g++ -std=c++14 test5.cpp -o test5 E:\MinGW\lib\libboost_random.a E:\MinGW\lib\libboost_system.a
#include <boost/random.hpp>
#include <boost/random/random_device.hpp>
#include <iostream>
#include <random>
using namespace std;
int main(){
boost::random_device rd;
boost::mt19937 mt(rd());
uniform_int_distribution<int> dist(0,99);
for (int i = 0; i< 16; ++i){
cout<<dist(mt)<<" ";
}
cout <<endl;
}
运行1:20 89 31 30 74 3 93 43 68 4 64 38 74 37 4 69
运行2:40 85 99 72 99 29 95 32 98 73 95 88 37 59 79 66