Почему std::uniform_real_distribution
лучше, чем rand()
в качестве генератора случайных чисел? Может ли кто-нибудь подать пример, пожалуйста?
Std:: uniform_real_distribution и rand()
Ответ 1
Реальное сравнение между rand
и одним из двигателей случайных чисел, предоставленных стандартной библиотекой С++ 11. std::uniform_real_distribution
просто распределяет вывод двигателя в соответствии с некоторыми параметрами (например, реальные значения между 10 и 20). Вы могли бы также создать движок, который использует rand
за кулисами.
В настоящее время разница между стандартными механизмами случайных чисел библиотеки и использованием простого старого rand
является гарантией и гибкостью. rand
не гарантирует качество случайных чисел - на самом деле, многие реализации имеют недостатки в их распределении и периоде. Если вам нужны высококачественные случайные числа, rand
просто не будет. Однако качество двигателей с произвольным числом определяется их алгоритмами. Когда вы используете std::mt19937
, вы точно знаете, что вы получаете от этого тщательно протестированного и проанализированного алгоритма. Различные двигатели имеют разные качества, которые вы можете предпочесть (эффективность пространства, эффективность времени и т.д.) И все конфигурируются.
Это не означает, что вы должны использовать rand
, когда вас не волнует слишком много. Вы могли бы просто начать использовать возможности генерации случайных чисел из С++ 11 сразу. Нет недостатка.
Ответ 2
Во-первых, должно быть ясно, что предлагаемое сравнение бессмысленно.
uniform_real_distribution
не является генератором случайных чисел. Вы не можете создавать случайные числа из uniform_real_distribution
без генератора случайных чисел, которые вы передаете в operator()
. uniform_real_distribution
"формирует" выход этого генератора случайных чисел в равномерное реальное распределение. Вы можете подключить различные типы генераторов случайных чисел в дистрибутив.
Я не думаю, что это приводит к хорошему сравнению, поэтому я буду сравнивать использование uniform_real_distribution
с генератором случайных чисел С++ 11 вместо rand()
.
Еще одно очевидное отличие, которое делает сравнение еще менее полезным, заключается в том, что uniform_real_distribution
используется для создания чисел с плавающей запятой, а rand()
- целые числа.
Тем не менее, есть несколько причин предпочесть новые возможности.
rand()
- глобальное состояние, тогда как при использовании средств из <random>
не существует глобального состояния: вы можете иметь столько генераторов и распределений, сколько хотите, и все они независимы друг от друга.
rand()
не имеет спецификации качества генерируемой последовательности. Генераторы случайных чисел из С++ 11 хорошо определены, а также дистрибутивы. Реализации rand()
могут быть и на практике были очень низкого качества и не очень однородны.
rand()
предоставляет случайное число в пределах предопределенного диапазона. Программисту необходимо настроить этот диапазон до нужного диапазона. Это непростая задача. Нет, недостаточно использовать%. Выполнение такого рода корректировки таким наивным образом, скорее всего, приведет к разрушению любой однородности в исходной последовательности. uniform_real_distribution
правильная настройка диапазона для вас.
Ответ 3
На самом деле причина в названии функции заключается в том, что однородность распределения случайных чисел лучше с std::uniform_real_distribution
по сравнению с равномерным распределением случайных чисел, которое rand()
обеспечивает.
Распределение для std::uniform_real_distribution
, конечно, лежит между заданным интервалом [a, b).
По существу, это говорит о том, что плотность вероятности, когда вы запрашиваете случайное число от 1 до 10, так же хороша в получении 5 или получении 9 или любых других возможных значений с помощью std::uniform_real_distribution
, как если бы вы сделайте это с помощью rand()
и назовите его несколько раз, вероятность получения 5 вместо 9 может отличаться.