Какой генератор псевдослучайных чисел использовать в C ++ 11?

C ++ 11 поставляется с набором PRNG.

В какой ситуации один должен выбирать один над другим? Каковы их преимущества, недостатки и т. Д.

11

Решение

я думаю Мерсенн твистер std::mt19937 Двигатель просто отлично, как «по умолчанию» PRNG.

Вы можете просто использовать std::random_device чтобы получить недетерминированное семя для mt19937,

На GoingNative 2013 очень интересная беседа Стефан Т. Лававей:

rand() Считается вредным

Вы также можете скачать слайды с этого веб-сайта. В частности, слайд № 23 четко сравнивает mt19937 против random_device:

  • mt19937 является:
    • Быстро (499 МБ / с = 6,5 циклов / байт для меня)
    • Очень высокое качество, но не криптографически безопасный
    • Seedable (более 32 бит, если хотите)
    • Воспроизводимый (стандартный алгоритм)
  • random_device является:
    • Возможно, медленно (1,93 МБ / с = 1683 цикла / байт для меня)
    • Сильно зависит от платформы (GCC 4.8 может использовать IVB RDRAND)
    • Возможно криптобезопасен (проверьте документацию, верно для VC)
    • Не посеянный, невоспроизводимый
15

Другие решения

Компромисс — скорость, объем памяти и период PRNG.

  1. Линейные конгруэнтные генераторы: быстрые, мало памяти, малый период

  2. Отстающие Фибоначчи (вычитать с переносом): быстро, большая память, большой период

  3. Mersenne Twister: медленно, очень большая память, очень большой период

2

По вопросам рекламы [email protected]