rand() considered harmful需要指出的是srand(time(NULL))
不好,因为srand
需要unsigned int
,但是对于微软的编译器,time_t
默认是64位数字,因此发生缩小转换。但是,time_t
是实现定义的。srand(time(NULL))不好?
因为我看到srand(time(NULL))
如此流行(即使在这个网站上),应该不鼓励吗?
rand() considered harmful需要指出的是srand(time(NULL))
不好,因为srand
需要unsigned int
,但是对于微软的编译器,time_t
默认是64位数字,因此发生缩小转换。但是,time_t
是实现定义的。srand(time(NULL))不好?
因为我看到srand(time(NULL))
如此流行(即使在这个网站上),应该不鼓励吗?
因为我看到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
的问题,如果time_t
太大,只需将其折叠以符合srand
的预期。您甚至可能会折叠过程PID,以便批量模拟作业按预期/预期工作。
当'/ dev/urandom'不可用时,为了让种子更难猜测,为避免冲突,Perl将进程ID,堆栈指针和时间(gettimeofday中的秒数+微秒)混合起来。 http://perl5.git.perl.org/perl.git/blob/v5.20.1:/util.c#l4409 – Schwern 2014-10-06 06:43:42
有更好的随机化方式,为什么不使用它们? – 2014-10-05 20:17:24
这是关于你可以在C或者C++ 98/03中做的最好的。 C++ 11增加了一个新的''头,新的随机数生成功能大大改善了情况。 –
2014-10-05 20:18:46
尽管如此,Boost在C++ 98中有更好的PRNG。 – chris 2014-10-05 20:23:00