Я использую реализацию boost mt19937 для симуляции.
Имитация должна быть воспроизводимой, а это означает хранение и потенциальное повторное использование семян ГСЧ позднее. Я использую windows crypto api для генерации начальных значений, потому что мне нужен внешний источник для начальных значений, а не из-за каких-либо конкретных гарантий случайности. Выходные данные любого прогона моделирования будут иметь примечание, включая начальное значение ГСЧ, поэтому начальное число должно быть достаточно коротким . С другой стороны, в рамках анализа симуляции я буду сравнивать несколько прогонов - но чтобы быть уверенным, что эти прогоны на самом деле разные, мне нужно использовать разные семена - поэтому семя нужно быть достаточно длинным, чтобы избежать случайных столкновений .
Я определил, что 64-разрядного начального числа должно быть достаточно; вероятность столкновения достигнет 50% после примерно 2 ^ 32 запусков - эта вероятность достаточно мала, поэтому средняя ошибка, вызванная ею, для меня незначительна. Использовать только 32-битное начальное значение сложно; вероятность столкновения достигает 50% уже после 2 ^ 16 пробежек; и это слишком вероятно для моих вкусов.
К сожалению, реализация надстройки либо заполняется вектором с полным состоянием - что слишком далеко, слишком долго - или одиночным 32-разрядным длинным без знака - что не идеально.
Как я могу заполнить генератор более чем 32-битным, но меньшим, чем вектор полного состояния? Я попытался просто заполнить вектор или повторить начальные числа, чтобы заполнить вектор состояния, но даже беглый взгляд на результаты показывает, что это приводит к плохим результатам.