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

В чем разница между shuffle и random_shuffle С++

В С++ 11 была введена функция std:: shuffle:

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

и имеет ту же подпись, что и одна из перегрузок std:: random_shuffle, которая также была введена в С++ 11:

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

Разница заключается в третьем параметре, где:

URNG должен удовлетворять требованиям UniformRandomNumberGenerator

Это все? Разница только в том, что shuffle выполняет дополнительную проверку времени компиляции? Является ли поведение иначе одинаковым?

4b9b3361

Ответ 1

Если вы внимательно прочитаете документацию на cppreference.com, вы обнаружите, что RandomFunc, переданный в random_shuffle, имеет другой интерфейс. Он вызывается как r(n). Это существовало до С++ 11.

std::shuffle использует стандартизованный способ получения случайных чисел и вызывает g(). Это стандартизованные генераторы случайных чисел, где введены с С++ 11 вместе с std::shuffle.

Ответ 2

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

Смотрите этот разговор Стефана Т. Лававей, в котором он объясняет, почему std::rand является плохой функцией и что программисты на С++ должны использовать вместо этого:

Суть заключается в том, что std::shuffle является улучшением по сравнению с std::random_shuffle, а программистам на С++ следует использовать первый.