std ::iform_real_distribution и rand ()

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

11

Решение

Реальное сравнение между rand и один из механизмов случайных чисел, предоставляемый стандартной библиотекой C ++ 11. std::uniform_real_distribution просто распределяет мощность двигателя по некоторым параметрам (например, реальные значения от 10 до 20). Вы могли бы также сделать двигатель, который использует rand за кулисами.

Теперь разница между стандартной библиотекой движков случайных чисел и использованием простого старого rand в гарантии и гибкости. rand не дает гарантии качества случайных чисел — на самом деле, многие реализации имеют недостатки в их распределении и периоде. Если вы хотите высококачественные случайные числа, rand просто не буду делать Однако качество механизмов случайных чисел определяется их алгоритмами. Когда вы используете std::mt19937Вы точно знаете, что получаете от этого тщательно протестированного и проанализированного алгоритма. Различные двигатели имеют разные качества, которые вы можете предпочесть (экономия пространства, экономия времени и т. Д.), И все они настраиваются.

Это не значит, что вы должны использовать rand когда тебя не волнует слишком много. С таким же успехом вы можете сразу начать использовать средства генерации случайных чисел из C ++ 11. Там нет недостатков.

9

Другие решения

Во-первых, должно быть ясно, что предлагаемое сравнение бессмысленно.

uniform_real_distribution не генератор случайных чисел. Вы не можете производить случайные числа из uniform_real_distribution без генератора случайных чисел, который вы передаете его operator(). uniform_real_distribution «формирует» выходные данные этого генератора случайных чисел в единое реальное распределение. Вы можете подключить к распределению различные генераторы случайных чисел.

Я не думаю, что это делает для достойного сравнения, поэтому я буду сравнивать использование uniform_real_distribution с генератором случайных чисел C ++ 11 против rand() вместо.

Еще одно очевидное отличие, которое делает сравнение еще менее полезным, заключается в том, что uniform_real_distribution используется для получения чисел с плавающей запятой, в то время как rand() производит целые числа.

Тем не менее, есть несколько причин, чтобы предпочесть новые объекты.

rand() является глобальным состоянием, в то время как при использовании средств из <random> в этом нет глобального состояния: вы можете иметь столько генераторов и распределений, сколько хотите, и все они независимы друг от друга.

rand() не имеет никаких указаний относительно качества генерируемой последовательности. Все генераторы случайных чисел из C ++ 11 хорошо определены, как и распределения. rand() Реализации могут быть и на практике были очень низкого качества и не очень однородными.

rand() обеспечивает случайное число в пределах предопределенного диапазона. Программист должен отрегулировать этот диапазон до желаемого диапазона. Это не простая задача. Нет, недостаточно использовать% что-то. Выполнение такого рода корректировки таким наивным образом, скорее всего, разрушит все, что было в исходной последовательности. uniform_real_distribution делает эту настройку диапазона для вас, правильно.

9

Причина на самом деле в названии функции, а именно в том, что равномерность распределения случайных чисел лучше с std::uniform_real_distribution по сравнению с равномерным распределением случайных чисел, которые rand() обеспечивает.

Распределение для std::uniform_real_distribution конечно между заданным интервалом [а, б).

По сути, это говорит о том, что вероятность плотность что когда вы запрашиваете случайное число от 1 до 10, это так же хорошо, как получить 5 или 9 или любое другое из возможных значений с std::uniform_real_distribution, как если бы вы сделали это с rand() и назовите это несколько раз, вероятность получения 5 вместо 9 может быть различной.

4
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector