C ++ 11 поставляется с набором PRNG.
В какой ситуации один должен выбирать один над другим? Каковы их преимущества, недостатки и т. Д.
я думаю Мерсенн твистер std::mt19937
Двигатель просто отлично, как «по умолчанию» PRNG.
Вы можете просто использовать std::random_device
чтобы получить недетерминированное семя для mt19937
,
На GoingNative 2013 очень интересная беседа Стефан Т. Лававей:
Вы также можете скачать слайды с этого веб-сайта. В частности, слайд № 23 четко сравнивает mt19937
против random_device
:
mt19937
является:
- Быстро (499 МБ / с = 6,5 циклов / байт для меня)
- Очень высокое качество, но не криптографически безопасный
- Seedable (более 32 бит, если хотите)
- Воспроизводимый (стандартный алгоритм)
random_device
является:
- Возможно, медленно (1,93 МБ / с = 1683 цикла / байт для меня)
- Сильно зависит от платформы (GCC 4.8 может использовать IVB RDRAND)
- Возможно криптобезопасен (проверьте документацию, верно для VC)
- Не посеянный, невоспроизводимый
Компромисс — скорость, объем памяти и период PRNG.
Линейные конгруэнтные генераторы: быстрые, мало памяти, малый период
Отстающие Фибоначчи (вычитать с переносом): быстро, большая память, большой период
Mersenne Twister: медленно, очень большая память, очень большой период