Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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: медленная, очень большая память, очень большой период