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

use*_*372 17 c++ random srand

被认为有害的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,以便批量模拟作业按预期/预期工作.

  • 当`/ dev/urandom`不可用时,为了使种子更难猜测,并避免冲突,Perl混合进程ID,堆栈指针和时间(最好是gettimeofday的秒+微秒).http://perl5.git.perl.org/perl.git/blob/v5.20.1:/util.c#l4409 (3认同)