В чем разница между shuffle и random shuffle c++

функции std:: shuffle был введен в C++11:

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

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

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

разница в третьем параметре, где:

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

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

2 ответов


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

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


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

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

суть в том, std::shuffle улучшение std::random_shuffle, и программисты C++ должны предпочесть использовать первое.