11. Затем опробуем ее для всех других генераторов:
cout << "nminstd_rand0" << '\n';
histogram
cout << "nminstd_rand" << '\n';
histogram
cout << "nmt19937" << '\n';
histogram
cout << "nmt19937_64" << '\n';
histogram
cout << "nranlux24_base" << '\n';
histogram
cout << "nranlux48_base" << '\n';
histogram
cout << "nranlux24" << '\n';
histogram
cout << "nranlux48" << '\n';
histogram
cout << "nknuth_b" << '\n';
histogram
}
12. Компиляция и запуск программы дадут интересные результаты. Мы увидим длинный список, содержащий выходные данные, и узнаем, что все генераторы случайных чисел имеют разные характеристики. Сначала запустим программу, в которой количество сегментов равно 10
1000
(рис. 8.5).13. Затем запустим эту же программу снова. В этот раз количество сегментов все еще будет равно 10
1,000,000
. Станет очевидно, что гистограммы выглядят гораздо лучше, когда мы берем для них больше образцов (рис. 8.6). Это важное наблюдение.Как это работает
Как правило, перед использованием генератора случайных чисел нужно создать объект этого класса. Полученный объект может быть вызван как функция без параметров, поскольку он перегружает operator()
В этом разделе мы написали довольно сложную программу, чтобы чуть больше узнать о генераторах случайных чисел. Пожалуйста, поработайте с получившейся программой, запуская ее с разными аргументами командной строки, и проверьте следующее:
□ чем больше образцов мы возьмем, тем больше будут равны наши счетчики разделов;
□ неравенство счетчиков разделов значительно отличается между отдельными генераторами;
□ для большого числа образцов становится понятно, что
□ запустите программу с небольшим количеством образцов несколько раз. Шаблоны распределения будут выглядеть
std::random_device
.Как видите, необходимо рассмотреть несколько характеристик. Для большинства стандартных приложений достаточно применить std::default_random_engine
Из данного примера следует сделать три вывода.
1. Как правило, std::default_random_engine
2. Если действительно нужно получить недетерминированные случайные числа, то поможет std::random_device
3. Можно передать конструктору любого генератора случайных чисел реальное случайное число, полученное от std::random_device
std::random_device
Генерируем случайные числа и создаем конкретные распределения с помощью STL
Из предыдущего примера мы узнали о генераторах случайных чисел, предоставляемых STL. Генерация случайных чисел тем или иным способом — зачастую лишь половина работы.
Возникает еще один вопрос: для чего нужны эти числа? Мы просто программно «подбрасываем монетку»? Обычно это делается с помощью конструкции rand()%2
0
и 1
, которые можно сопоставить с