Почему я получаю одну и ту же последовательность для каждого запуска с std::random device с mingw gcc4.8.1?
Я использую следующий код, чтобы проверить c++ <random>
библиотека.
почему я получаю точно такую же последовательность для каждого запуска скомпилированного исполняемого файла? Это rd()
детерминированным при компиляции? Как получить разные выходные данные для каждого запуска?
GCC 4.8.1 на Windows 7 64bit. Использование дистрибутива MinGW от http://nuwen.net/mingw.html
EDIT: Я тестировал один и тот же фрагмент кода с 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;
}
4 ответа:
от http://en.cppreference.com/w/cpp/numeric/random/random_device:
обратите внимание, что std::random_device может быть реализован в терминах механизма псевдослучайных чисел, если недетерминированный источник (например, аппаратное устройство) недоступен для реализации.
Я бы ожидал, что достойная реализация, по крайней мере, посеяла RNG.
Edit: я подозреваю, что они намеренно решили доставить каждый раз одна и та же последовательность, чтобы сделать очевидным тот факт, что поток не был таким случайным, как обещал.
Я получил подтвержденный ответ от STL от MSFT:
В отличие от VC, GCC не реализовал random_device недетерминированно на Windows. Boost имеет, так что вы можете использовать Boost.Случайность.
возможно, Вам потребуется передать параметр конструктору:
https://gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/api/a00899.html
GCC не реализует rd.entropy () правильно-он всегда возвращает 0 (по крайней мере, на Mac OS X).
- внутренне реализует криптографический алгоритм для обработки битов энтропии, которые он получает для генерации своего выхода, я хотел бы иметь возможность "рандомизировать" этот процесс больше, вводя мои собственные данные для смешивания с любой энтропией, которую выбирает это устройство. Например, рассмотрим Java SecureRandom (). Это не позволяет вам set семя (которое действительно преобразует его в PRNG), но он с радостью смешал бы то, что вы предоставляете, с тем, что он использует, чтобы "рандомизировать" его выход еще больше.
лично я предпочитаю RDRAND. Небольшая библиотека сборок с компактным интерфейсом C. Вот ссылки:
Дэвид Джонсон из Intel объясняет RDRAND на Stackoverflow
StackOverflow указывает на источник библиотеки RDRAND для Windows, Linux и Mac OS X