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

В C ++ 11 можно генерировать числа с использованием std::random_device с или без генератора псевдослучайных чисел, как mt19937.

Какая будет разница, используя это в этом примере кода:

#include <random>
#include <iostream>

int main() {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1, 10);

for (int i=0; i<16; ++i)
std::cout << dist(rd) << "\t" << dist(mt) << "\n";
}

4

Решение

std::random_device должен принести вам семена для таких двигателей, как mt19937, Качество создаваемых последовательных чисел полностью не определено и может легко оказаться недостаточным для практических целей (таких как криптография), поэтому полагаться на это нельзя.

Помимо этого, mt19937 даст вам ту же последовательность, когда дано то же семя. random_deviceНа значения s может влиять только строка, переданная ее конструктору … что подразумевает поведение, определяемое реализацией.

4

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

Есть два отличия, о которых я знаю:

  1. С помощью mt199937 будет быстрее, но менее криптографически безопасным.
  2. std::random_device всегда будет случайным, но если вы инициализируете mt19937 с постоянным начальным числом всегда будут отображаться одинаковые случайные числа:

    std::mt19937 mt(2014);

Будет выдавать одну и ту же последовательность случайных битов каждый раз. Это может быть полезно, если вы хотите проверять определенное поведение снова и снова. Стандарт требует этого в 26.5.5 / 4:

Требуемое поведение: 10000-й последовательный вызов построенного по умолчанию объекта типа mt19937 должен произвести значение 4123659995.

Там нет такой эквивалентной согласованности с std::random_device,

1

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