Как сохранить состояние C ++ 0X Генератор случайных чисел - PullRequest
5 голосов
/ 14 мая 2011

Я играю с новой случайной библиотекой C ++ 0X и основываюсь на этом вопросе:
Каков стандартный способ получить состояние генератора случайных чисел C ++ 0x?
кажется, что если вы не знаете начальное значение для текущего состояния генератора случайных чисел, единственный способ сохранить его состояние - сохранить генератор в потоке. Для этого я написал следующее

#include <iostream>
#include <sstream>
#include <random>

int main(int /*argc*/, char** /*argv*/)
{
  std::mt19937 engine1;
  unsigned int var = engine1(); // Just to get engine1 out of its initial state
  std::stringstream input;
  input << engine1;
  std::mt19937 engine2;
  input >> engine2;
  std::cout<<"Engine comparison: "<<(engine1 == engine2)<<std::endl;
  std::cout<<"Engine 1 random number "<<engine1()<<std::endl;
  std::cout<<"Engine 2 random number "<<engine2()<<std::endl;
}

Это выводит

Сравнение двигателей: 1
Двигатель 1 случайное число 581869302
Двигатель 2 случайное число 4178893912

У меня есть несколько вопросов:

  • Почему следующие числа от engine1 и engine2 отличаются?
  • Почему два двигателя сравниваются равными, хотя их следующие числа различны?
  • Что я делаю не так в моем примере и как правильно сохранить состояние случайного движка, чтобы получить повторяемость при последующих запусках (при условии, что вы не знаете начальное значение для установки желаемого состояния)?

Спасибо.

1 Ответ

3 голосов
/ 14 мая 2011

Это похоже на ошибку для меня.Я запустил ваш код на libc ++ и вывел:

Engine comparison: 1
Engine 1 random number 581869302
Engine 2 random number 581869302
...