C ++ Reference перечисляет все случайные механизмы, в настоящее время предоставляемые C ++. Однако выбор двигателей оставляет желать лучшего (например, см. Мой список высококачественных случайных генераторов ). Например:
default_random_engine
определяется реализацией, поэтому неизвестно, имеет ли движок статистический fl aws, о котором может заботиться приложение. linear_congruential_engine
реализует линейный конгруэнтные генераторы. Однако они имеют тенденцию иметь низкое качество, если модуль не является простым и очень большим (не менее 64 бит). Кроме того, они не могут допустить больше семян, чем их модуль. minstd_rand0
и minstd_rand
допускают только около 2 ^ 31 семян. knuth_b
оборачивает minstd_rand0
и выполняет его перемешивание Бэйса-Дарема. mt19937
и mt19937_64
могут допустить гораздо больше семян, если их лучше инициализировать (например, путем инициализации std::seed_seq
с несколькими выходами random_device
, а не только один), но они используют около 2500 байтов состояния. ranlux24
и ranlux48
используют около 577 бит состояния, но они медленные (они работают по сохраняя некоторые и отбрасывая другие псевдослучайные выходные данные.)
Однако в C ++ также есть два механизма, которые обертывают другой механизм для потенциального улучшения его свойств случайности:
discard_block_engine
отбрасывает некоторые выходов данного случайного механизма. shuffle_order_engine
реализует тасовку Бэйса-Дарема данного случайного механизма.
Например, возможно, скажем, иметь Бэйс-Дарем перетасовка mt19937
, ranlux24
или пользовательский linear_congruential_engine
с shuffle_order_engine
. Возможно, завернутый двигатель более качественный, чем оригинальный. Тем не менее, трудно предсказать статистическое качество нового движка без тестирования его .
Таким образом, в ожидании таких тестов кажется, что mt19937
является наиболее практичным движком в стандарте C ++ на данный момент. , Однако мне известно, по крайней мере, одно предложение добавить еще один механизм случайных чисел в будущие версии C ++ (см. C ++ paper P2075 ).