Поскольку я вижу srand (время (NULL)) настолько распространенным (даже на этом сайте), следует ли его обескураживать?
Это зависит от того, как вы хотите использовать выходной сигнал вашего генератора (в этом случае выход rand()
).
Если вам нужно только единообразное распределение для одиночных прогонов вашей программы, то srand(time(NULL))
в порядке. Это было бы приемлемо в симуляции, где вам нужно было бы только равномерное распределение чисел быстро.
Если вы хотите отправить пакетное задание, чтобы одновременно запускать несколько экземпляров вашей программы (и эффективно запускаться в одно и то же время), то srand(time(NULL))
, вероятно, приведет к одному или нескольким экземплярам, производящим один и тот же случайный поток ,
Если вам нужен защищенный выход, вы должны не использовать srand(time(NULL))
, потому что его часто представляет собой линейный конгруэнтный генератор (LCG). Джоан Бояр научила нас, как разорвать их много лет назад. См. Inferring sequences produced by a linear congruential generator missing low-order bits.
Что касается проблемы с time_t
, просто свернуть ее, чтобы она соответствовала аргументу, ожидаемому srand
, если time_t
слишком велико. Вы могли бы даже сбросить PID процесса, чтобы задания на пакетное моделирование работали по назначению/ожиданию.
Есть лучшие способы рандомизации, почему бы не использовать их? –
Речь идет о лучшем, что вы можете сделать в C, или даже в C++ 98/03. C++ 11 добавил новый заголовок '' с новыми возможностями генерации случайных чисел, существенно улучшающих ситуацию. –
Хотя верно, Boost имеет лучшие PRNG, которые работают на C++ 98. – chris