Почему 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 может отличаться.