2013-07-18 2 views
4

Если вы посмотрите на характеристики случайного перетасовки в C++ 11, есть 3 функции. Мой вопрос: что это типичное использование и преимущества:Использование и утилита std :: shuffle?

template< class RandomIt, class URNG > 
void shuffle(RandomIt first, RandomIt last, URNG&& g); 

по сравнению с:

template< class RandomIt > 
void random_shuffle(RandomIt first, RandomIt last); 

Я имею в виду, кажется, что все, что URNG есть (равномерное распределение), то результат будет таким же, (со статистической точки зрения). Единственное, что я вижу, это то, что std::shuffle является безопасным, тогда как эта перегрузка std::random_shuffle - нет. Не могли бы вы подтвердить это?

EDIT: Я думал, что URNG должен быть равномерным распределением, но это, похоже, не компилируется. Так может ли кто-нибудь дать небольшой пример использования std::shuffle?

+0

Ну, первый позволяет выбрать генератор случайных чисел. Второй - нет. – juanchopanza

+1

Мне трудно поверить, что результат тот же. Как именно вы называете 'std :: shuffle'? – Xeo

+0

@Xeo, когда я говорю «то же», я имею в виду «статистически то же самое». – Vincent

ответ

2

Как уже упоминалось в комментариях, std::shuffle принимает Генератор случайных чисел A (или двигатель в стандартном говорить), а не распределение случайных чисел . Различные генераторы случайных чисел имеют разные характеристики, даже если они имеют теоретически равномерное распределение.

  • Случайных или псевдослучайных - генераторы случайных чисел Правды использовать какое-то внешний источник энтропии. Псевдослучайные генераторы (PRNG) строго детерминированы.
  • Производительность - некоторые генераторы быстрее других.
  • Использование памяти - для некоторых PRNG требуется больше памяти для хранения своего состояния, чем другие.
  • Период времени - все PRNG имеют конечный период, после которого они начинают повторять одну и ту же последовательность с самого начала. Некоторые из них имеют гораздо более длительные периоды, чем другие.
  • Качество случайности - есть numerous tests для измерения тонких (или не столь тонких!) Паттернов в потоке с псевдослучайным звуком. См. Например, Diehard tests.
  • Есть ли поток cryptographically secure или нет. AFAIK, ни один из стандартных PRNG.

Для получения информации о различных генераторах, предлагаемых стандартом, см. http://en.cppreference.com/w/cpp/numeric/random.