В чем разница между 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++ должны предпочесть использовать первое.