Как убедиться, что std:: random_shuffle всегда производит другой результат?

Есть ли какая-то функция, аналогичная srand(), которую мне нужно вызвать, чтобы убедиться, что 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 );

reference

Ответ 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
  • Отменить, если хэш уже присутствует

Я не вижу, как использование настраиваемого генератора может гарантировать уникальность последовательности.