MinGW提升random_device编译错误

时间:2016-02-29 22:21:23

标签: c++11 boost random mingw random-seed

我需要一些随机数进行模拟,并使用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目录中找到。任何人都可以建议代码或编译有什么问题吗?

1 个答案:

答案 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