srand(时间(NULL))不好吗?

时间:2014-10-05 20:15:40

标签: c++ random srand

rand() considered harmful中指出srand(time(NULL))不好,因为srand需要unsigned int,但对于Microsoft的编译器,time_t是default是64位数字,因此会发生缩小转换。但是,time_t是实现定义的。

由于我看到srand(time(NULL))如此普遍(即使在此网站上),是否应该劝阻?

1 个答案:

答案 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,以便批量模拟作业按预期/预期工作。