Для кода, который использует std::random_shuffle
Мне нужно установить случайное начальное число, чтобы создаваемые псевдослучайные последовательности менялись при каждом запуске программы.
пример кода здесь звонит
srand ( unsigned ( time (NULL) ) );
который должен
#include <ctime>
#include <cstdlib>
Интересно: поскольку C ++ 11 включает в себя основные обновления для генерации псевдослучайных чисел, это все еще актуально? Что я должен использовать, чтобы установить случайное семя для std::random_shuffle
?
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);
Если вы используете C ++ 11, подумайте об использовании std::shuffle
вместо std::random_shuffle
и прохождение генератора случайных чисел, как в последнем примере Вот
Если вы действительно заботитесь о точности, качестве и разнообразии способов генерации случайных чисел, я настоятельно рекомендую рассмотреть возможность использования известных Gnu Scientific Library
(GSL)
Это позволяет реально генерировать единообразно и использовать различные алгоритмы для лучшего. Увидеть Вот.
Специально этот а также этот описывает доступные алгоритмы:
— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...
РЕДАКТИРОВАТЬ : Также повышение :: случайный должна быть хорошей альтернативой, учитывая GPLness GSL (но я никогда не имел дело с этим …).