Ошибка компиляции MinGW boost random_device

Мне нужны случайные числа для моделирования, и я экспериментирую с библиотекой случайных чисел С++ 11, используя дистрибутив MinGW от nuwen.net.

Как обсуждалось в нескольких других темах, например. Почему я получаю одна и та же последовательность для каждого запуска с std::random_device с 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, и тогда код будет выглядеть примерно так, как показано ниже, взято из Как использовать boost::random_device для создания криптографически безопасного 64-битного целого числа? и из Способ изменить начальное значение boost::random при каждом запуске другой программы ,

// 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()». Обратите внимание, что файлы random.hpp и radndom_device.hpp доступны в каталоге include. Кто-нибудь может подсказать, что не так с кодом или с компиляцией?


person John    schedule 29.02.2016    source источник
comment
boost::random — это скомпилированная библиотека boost, в вашей командной строке вы должны связать ее, чтобы скомпилировать эту программу, иначе вы получите ошибку компоновщика.   -  person Chris Beck    schedule 01.03.2016
comment
Хорошо, компиляция test5.cpp выше с помощью g++ -std=c++14 test5.cpp -o test5 E:\MinGW\lib\libboost_random.a E:\MinGW\lib\libboost_system.a работает, т.е. случайные числа для каждого запуска.   -  person John    schedule 01.03.2016


Ответы (1)


Связывание кода с библиотеками повышения 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

person John    schedule 01.03.2016