Какой генератор псевдослучайных чисел использовать в С++ 11? С++ 11 поставляется с набором PRNG. В какой ситуации нужно выбирать один за другим? Каковы их преимущества, недостатки и т.д. Ответ 1 Я думаю, что движок Mersenne twister std::mt19937 отлично подходит как "PRNG" по умолчанию. Вы можете просто использовать std::random_device, чтобы получить недетерминированное семя для mt19937. Есть очень интересный разговор от GoingNative 2013 от Stephan T. Lavavej: rand() Считается вредоносным Вы также можете загрузить слайды с этого веб-сайта. В частности, слайд # 23 явно сравнивает mt19937 и random_device: mt19937: Быстрый (499 МБ/с = 6.5 циклов/байт для меня) Чрезвычайно высокое качество, но не криптографически безопасное Seedable (с более чем 32 битами, если вы хотите) Воспроизводимый (стандартный алгоритм) random_device: Возможно медленное (1.93 МБ/с = 1683 цикла/байт для меня) Сильно зависит от платформы (GCC 4.8 может использовать IVB RDRAND) Возможно, криптозащита (проверьте документацию, true для VC) Non-seedable, non-reproducible Ответ 2 Компромисс - это скорость, нота памяти и период PRNG. Линейные конгруэнтные генераторы: быстрая, низкая память, небольшой период Отложенный фибоначчи (вычитание с переносом): быстрая, большая память, большой период Mersenne Twister: медленная, очень большая память, очень большой период
Ответ 1 Я думаю, что движок Mersenne twister std::mt19937 отлично подходит как "PRNG" по умолчанию. Вы можете просто использовать std::random_device, чтобы получить недетерминированное семя для mt19937. Есть очень интересный разговор от GoingNative 2013 от Stephan T. Lavavej: rand() Считается вредоносным Вы также можете загрузить слайды с этого веб-сайта. В частности, слайд # 23 явно сравнивает mt19937 и random_device: mt19937: Быстрый (499 МБ/с = 6.5 циклов/байт для меня) Чрезвычайно высокое качество, но не криптографически безопасное Seedable (с более чем 32 битами, если вы хотите) Воспроизводимый (стандартный алгоритм) random_device: Возможно медленное (1.93 МБ/с = 1683 цикла/байт для меня) Сильно зависит от платформы (GCC 4.8 может использовать IVB RDRAND) Возможно, криптозащита (проверьте документацию, true для VC) Non-seedable, non-reproducible
Ответ 2 Компромисс - это скорость, нота памяти и период PRNG. Линейные конгруэнтные генераторы: быстрая, низкая память, небольшой период Отложенный фибоначчи (вычитание с переносом): быстрая, большая память, большой период Mersenne Twister: медленная, очень большая память, очень большой период