Подтвердить что ты не робот

Std:: uniform_real_distribution и rand()

Почему std::uniform_real_distribution лучше, чем rand() в качестве генератора случайных чисел? Может ли кто-нибудь подать пример, пожалуйста?

4b9b3361

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