Это современный С++ для использования 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 (но я никогда справился с этим...).