Является ли современным C ++ использование srand для установки случайного начального числа?

Для кода, который использует std::random_shuffleМне нужно установить случайное начальное число, чтобы создаваемые псевдослучайные последовательности менялись при каждом запуске программы.

пример кода здесь звонит

srand ( unsigned ( time (NULL) ) );

который должен

#include <ctime>
#include <cstdlib>

Интересно: поскольку C ++ 11 включает в себя основные обновления для генерации псевдослучайных чисел, это все еще актуально? Что я должен использовать, чтобы установить случайное семя для std::random_shuffle?

15

Решение

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);
25

Другие решения

Если вы используете C ++ 11, подумайте об использовании std::shuffle вместо std::random_shuffleи прохождение генератора случайных чисел, как в последнем примере Вот

3

Если вы действительно заботитесь о точности, качестве и разнообразии способов генерации случайных чисел, я настоятельно рекомендую рассмотреть возможность использования известных Gnu Scientific Library (GSL)

Это позволяет реально генерировать единообразно и использовать различные алгоритмы для лучшего. Увидеть Вот.

Специально этот а также этот описывает доступные алгоритмы:

— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...

РЕДАКТИРОВАТЬ : Также повышение :: случайный должна быть хорошей альтернативой, учитывая GPLness GSL (но я никогда не имел дело с этим …).

0
По вопросам рекламы [email protected]