在rand()被认为有害中,有人指出srand(time(NULL))是坏的,因为srand使用unsigned int,但是对于微软的编译器来说,time_t默认是64位数,因此会发生缩小转换的情况。然而,time_t是实现定义的。
既然我看到srand(time(NULL))如此流行(即使在这个网站上),它是否应该被阻止呢?
发布于 2014-10-05 20:30:53
既然我看到srand(time(NULL))如此流行(即使在这个站点上),它是否应该被阻止呢?
这取决于您希望如何使用来自生成器的输出(在本例中,是rand()的输出)。
如果您只需要为程序的一次运行提供统一的发行版,那么srand(time(NULL))就可以了。这在模拟中是可以接受的,因为您只需要快速地均匀地分配数字。
如果您希望提交一个批处理作业,以便您的程序的多个实例同时运行(并且有效地同时启动),那么srand(time(NULL))可能会导致一个或多个实例产生相同的随机流。
如果您需要一个安全的输出,那么您不应该使用srand(time(NULL)),因为它通常是一个线性同步器(LCG)。琼·博亚尔几年前教我们如何打破它们。见由缺失低阶位的线性同余发生器产生的序列推断。
至于time_t的问题,如果time_t太大,就把它折叠起来,以适应srand所期望的参数。您甚至可以在进程PID中折叠,以便批处理模拟作业按照预期/预期工作。
https://stackoverflow.com/questions/26206780
复制相似问题