Это современный С++ для использования srand для установки случайных семян?
Для кода, использующего std::random_shuffle
, мне нужно установить случайное семя, чтобы возникающие псевдослучайные последовательности изменялись в каждом прогоне программы.
Пример кода здесь позволяет позвонить
srand ( unsigned ( time (NULL) ) );
которому необходимо
#include <ctime>
#include <cstdlib>
Интересно: поскольку С++ 11 включает в себя основные обновления для генерации псевдослучайных чисел, это все еще актуально? Что я должен использовать для установки случайного семени для std::random_shuffle
?
Ответы
Ответ 1
random_shuffle
использует генератор случайных чисел, определенный реализацией, если вы его не предоставили. Таким образом, нет, использование srand
не обязательно правильно.
В противном случае он использует генератор, который вы предоставляете. Вы можете использовать rand
, если хотите убедиться, что это используется.
srand(seed);
std::random_shuffle(first, last, [](int n) { return rand() % n; });
// this is a biased generator
// see <http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx>
Однако я рекомендую использовать новые средства <random>
вместо rand(). Пример.
std::default_random_engine gen(seed);
std::shuffle(first, last, gen);
Ответ 2
Если вы используете С++ 11, подумайте об использовании std::shuffle
вместо std::random_shuffle
и передав генератор случайных чисел, как в последнем примере здесь
Ответ 3
Если вы действительно заботитесь о точности, качестве и разнообразии способов генерации случайных чисел, я бы предложил предложить использовать знаменитый Gnu Scientific Library
(GSL)
Это позволяет обеспечить реальную однородную генерацию и различные алгоритмы для наилучшего. См. здесь.
Специально this и this описывает доступные алгоритмы:
— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...
EDIT: Также boost:: random должен быть хорошей альтернативой, учитывая GPLness GSL (но я никогда справился с этим...).