在rand() considered harmful中指出srand(time(NULL))
不好,因为srand
需要unsigned int
,但对于Microsoft的编译器,time_t
是default是64位数字,因此会发生缩小转换。但是,time_t
是实现定义的。
由于我看到srand(time(NULL))
如此普遍(即使在此网站上),是否应该劝阻?
答案 0 :(得分:12)
因为我看到srand(时间(NULL))如此普遍(即使在这个网站上),是否应该气馁呢?
这取决于您希望如何使用生成器的输出(在本例中为rand()
的输出)。
如果您只需要对程序的单次运行进行统一分发,那么srand(time(NULL))
就可以了。这在模拟中是可以接受的,您只需要快速均匀分布数字。
如果要提交批处理作业,以便程序的多个实例同时运行(并且有效地同时启动),则srand(time(NULL))
可能会导致一个或多个实例生成相同的随机流。
如果您需要安全输出,则不使用srand(time(NULL))
,因为它通常是线性同余生成器(LCG)。 Joan Boyar多年前教我们如何打破它们。请参阅Inferring sequences produced by a linear congruential generator missing low-order bits。
对于time_t
的问题,如果srand
太大,只需将其折叠以适合time_t
预期的参数。您甚至可以折叠过程PID,以便批量模拟作业按预期/预期工作。