在被认为有害的rand()中,它被指出srand(time(NULL))是坏的,因为srand需要一个unsigned int,但对于Microsoft的编译器,time_t默认情况下是64位数,因此发生缩小转换.但是,time_t是实现定义的.
既然我看到srand(time(NULL))如此普遍(即使在这个网站上),是否应该气馁?
jww*_*jww 12
因为我看到srand(时间(NULL))如此普遍(即使在这个网站上),是否应该气馁?
这取决于您希望如何使用生成器的输出(在本例中为输出rand()).
如果您只需要为程序的单次运行进行统一分发,那么srand(time(NULL))就可以了.这在模拟中是可以接受的,在模拟中您只需要快速均匀分布数字.
如果要提交批处理作业以使程序的多个实例同时运行(并且有效地同时启动),则srand(time(NULL))可能会导致一个或多个实例生成相同的随机流.
如果你需要一个安全的输出,那么你应该不能使用srand(time(NULL)),因为它往往是一个线性同余发生器(LCG).Joan Boyar多年前教我们如何打破它们.请参阅由缺少低阶位的线性同余生成器生成的推断序列.
至于问题time_t,只需将其折叠以适合srandif time_t所期望的参数过大.您甚至可以折叠过程PID,以便批量模拟作业按预期/预期工作.