Почему я получаю одну и ту же последовательность для каждого запуска с 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 61

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

  1. GCC не реализует rd.entropy () правильно-он всегда возвращает 0 (по крайней мере, на Mac OS X).

  2. внутренне реализует криптографический алгоритм для обработки битов энтропии, которые он получает для генерации своего выхода, я хотел бы иметь возможность "рандомизировать" этот процесс больше, вводя мои собственные данные для смешивания с любой энтропией, которую выбирает это устройство. Например, рассмотрим Java SecureRandom (). Это не позволяет вам set семя (которое действительно преобразует его в PRNG), но он с радостью смешал бы то, что вы предоставляете, с тем, что он использует, чтобы "рандомизировать" его выход еще больше.
  3. лично я предпочитаю RDRAND. Небольшая библиотека сборок с компактным интерфейсом C. Вот ссылки:

    Дэвид Джонсон из Intel объясняет RDRAND на Stackoverflow

    StackOverflow указывает на источник библиотеки RDRAND для Windows, Linux и Mac OS X

    блог Intel on Библиотека RDRAND и ссылка для скачивания