В чем разница между 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
выполняет дополнительную проверку времени компиляции? Является ли поведение иначе одинаковым?
Ответы
Ответ 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
, а программистам на С++ следует использовать первый.