Есть ли какая-то функция, аналогичная srand()
, которую мне нужно вызвать, чтобы убедиться, что std::random_shuffle()
всегда производит разные результаты? т.е. если я назову его несколько раз с теми же данными, я хочу, чтобы порядок был разным каждый раз. Как я могу убедиться в этом?
Как убедиться, что std:: random_shuffle всегда производит другой результат?
Ответ 1
std::random_shuffle
имеет две формы. Один, который принимает 2 аргумента (begin/end iterators), и тот, который принимает 3 (begin/end итератор и случайный генератор).
В первой форме используется std::rand()
, поэтому вы должны использовать std::srand()
, чтобы засеять его генератор случайных чисел. Вы также можете использовать версию с тремя аргументами и самостоятельно предоставить RNG.
Ответ 2
std::random_shuffle
имеет перегрузку шаблона для указания RNG.
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator& rand );
Ответ 3
Я думаю, вы можете дать случайный генератор-функтор для std:: random_shuffle, чтобы вы могли полностью контролировать генерацию случайных чисел. Если смотреть здесь, этот функтор заменяет аргумент шаблона RandomNumberGenerator.
Ответ 4
Как правило, вызов srand(time(NULL))
до вызова std:: random_shuffle() даст вам то, что вам нужно, оно дает вам разные результаты при каждом вызове std:: random_shuffle(). Это потому, что std:: random_shuffle() внутренне вызывает rand() во многих реализациях с заполнением (например, VS2008 и gcc).
Конечно, вы можете подавить RNG самостоятельно, если вы хотите вызвать другой перегруженный std:: random_shuffle с дополнительным параметром.
Ответ 5
random_shuffle устарел с С++ 14 (удален в С++ 17) и заменен на тасование (существует с С++ 11) http://en.cppreference.com/w/cpp/algorithm/random_shuffle
возможное использование:
shuffle(items.begin(), items.end(), std::default_random_engine(std::random_device()()));
Ответ 6
В качестве последнего средства вы можете:
- Вызов
std::random_shuffle
- Вычислить хэш последовательности, сохранить его в
std::set
- Отменить, если хэш уже присутствует
Я не вижу, как использование настраиваемого генератора может гарантировать уникальность последовательности.