В 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";
}
std::random_device
должен принести вам семена для таких двигателей, как mt19937
, Качество создаваемых последовательных чисел полностью не определено и может легко оказаться недостаточным для практических целей (таких как криптография), поэтому полагаться на это нельзя.
Помимо этого, mt19937
даст вам ту же последовательность, когда дано то же семя. random_device
На значения s может влиять только строка, переданная ее конструктору … что подразумевает поведение, определяемое реализацией.
Есть два отличия, о которых я знаю:
mt199937
будет быстрее, но менее криптографически безопасным. std::random_device
всегда будет случайным, но если вы инициализируете mt19937
с постоянным начальным числом всегда будут отображаться одинаковые случайные числа:
std::mt19937 mt(2014);
Будет выдавать одну и ту же последовательность случайных битов каждый раз. Это может быть полезно, если вы хотите проверять определенное поведение снова и снова. Стандарт требует этого в 26.5.5 / 4:
Требуемое поведение: 10000-й последовательный вызов построенного по умолчанию объекта типа
mt19937
должен произвести значение 4123659995.
Там нет такой эквивалентной согласованности с std::random_device
,