Как убедиться, что std :: random_shuffle всегда дает другой результат? - PullRequest
13 голосов
/ 03 августа 2011

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

Ответы [ 6 ]

13 голосов
/ 03 августа 2011

std::random_shuffle имеет две формы. Один, который принимает 2 аргумента (итераторы начала / конца), а другой - 3 (итератор начала / конца и генератор случайных чисел)

Первая форма использует std::rand(), поэтому вы должны использовать std::srand() для заполнения генератора случайных чисел. Вы также можете использовать версию с тремя аргументами и предоставить RNG самостоятельно.

6 голосов
/ 03 августа 2011

std::random_shuffle имеет перегрузку шаблона для указания ГСЧ.

template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                        RandomNumberGenerator& rand );

ссылка

5 голосов
/ 23 февраля 2016

random_shuffle устарел с C ++ 14 (удалено в C ++ 17) и заменено на shuffle (существует с C ++ 11) http://en.cppreference.com/w/cpp/algorithm/random_shuffle

возможное использование:

shuffle(items.begin(), items.end(), std::default_random_engine(std::random_device()()));
3 голосов
/ 04 августа 2011

Обычно вызов srand(time(NULL)) перед вызовом std :: random_shuffle () даст вам то, что вам нужно, каждый раз, когда вы вызываете std :: random_shuffle (), вы получите другой результат.Это потому, что std :: random_shuffle () внутренне вызывает rand () во многих заполненных реализациях (например, VS2008 и gcc).

Конечно, вы можете дополнить RNG самостоятельно, если хотите вызвать другой перегруженный std :: random_shuffleс дополнительным параметром.

3 голосов
/ 03 августа 2011

Я думаю, что вы можете передать функтор генератора случайных чисел в std :: random_shuffle, чтобы вы могли полностью контролировать генерацию случайных чисел.Если смотреть здесь , этот функтор занимает место аргумента шаблона RandomNumberGenerator.

2 голосов
/ 04 августа 2011

В крайнем случае вы можете:

  • Вызвать std::random_shuffle
  • Вычислить хэш последовательности, сохранить его в std::set
  • Откажитесь, если хеш уже существует

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

...