Is srand (time (NULL)) плохо?

В rand() считается вредным, указано, что srand(time(NULL)) плохо, потому что srand принимает unsigned int, но для компилятора Microsoft time_t по умолчанию - это 64-разрядное число, поэтому происходит сужение конверсии. Однако time_t определяется реализацией.

Поскольку я вижу srand(time(NULL)) настолько распространенным (даже на этом сайте), следует ли его обескураживать?

Ответы

Ответ 1

Поскольку я вижу srand (time (NULL)) настолько распространенным (даже на этом сайте), следует ли его обескураживать?

Это зависит от того, как вы хотите использовать вывод из вашего генератора (в этом случае вывод rand()).

Если вам нужен только единый дистрибутив для одиночных прогонов вашей программы, тогда srand(time(NULL)) будет в порядке. Это было бы приемлемо в симуляции, где вам нужно только быстрое распределение чисел.

Если вы хотите отправить пакетное задание, чтобы одновременно запускать несколько экземпляров вашей программы (и эффективно запускаться в одно и то же время), тогда srand(time(NULL)), вероятно, приведет к одному или нескольким экземплярам, ​​производящим одинаковые случайные поток.

Если вам нужен защищенный вывод, вы не должны использовать srand(time(NULL)), потому что его часто представляет собой линейный конгруэнтный генератор (LCG). Джоан Бояр научила нас, как разорвать их много лет назад. См. Вывод последовательностей, создаваемых линейным конгруэнтным генератором, пропускающих младшие разряды.

Что касается проблемы с time_t, просто сместите ее, чтобы соответствовать аргументу, ожидаемому srand, если time_t слишком велико. Вы можете даже сбросить в PID процесса, чтобы задания моделирования партии работали по назначению/ожиданию.