2015-09-12 3 views
1

У меня есть монте-карлоподобная система, где у меня есть определенное состояние, которое эволюционирует случайным образом, используя генератор случайных чисел. Я также сохраняю копию этого состояния в другом месте программы, так как я хотел бы знать, как она будет развиваться, если бы она фактически эволюционировала. Для этого требуется 2 вещи генератора случайных чисел:Использование генераторов случайных чисел C++ в чистом виде

1) Возможность клонирования генератора без его модификации для хранения в скопированной версии состояния.

2) Способность определить, какое следующее случайное число было бы от копии генератора const.

Возможно ли это использование только стандартной библиотеки? Если нет, можете ли вы порекомендовать стороннюю библиотеку?

ответ

3

Стандартные C++11 random generators являются обычными объектами, которые могут быть скопированы, а копии будут воспроизводить идентичные последовательности. Они также могут сериализовать и десериализовать свое внутреннее состояние в iostreams, используя operator<< и operator>>.

operator(), который генерирует случайные числа, не является функцией const, так как он изменяет внутреннее состояние генератора. Поэтому вы не можете называть его непосредственно на копии генератора const. Но вы можете сделать временную изменчивую копию файла const, сгенерировать значение из него, а затем уничтожить его.

Если ваш компилятор не поддерживает C++ 11, вы можете использовать Boost.Random library, который был основой для стандартного.

+0

За исключением 'std :: random_device', который может быть либо псевдо RNG, либо истинным случайным устройством, например. используя квантовый эффект, случайный на современном процессоре. С таким не детерминированным RNG последовательность копий может быть разной. –

+1

@Calvin, ну, этот класс не копируется, поэтому во время компиляции быстро стало ясно, что вы не можете сделать детерминированные копии. Но да, я должен был упомянуть об этом как оговорку. – Wyzard

Смежные вопросы