2014-10-05 33 views
15

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

因为我看到srand(time(NULL))如此流行(即使在这个网站上),应该不鼓励吗?

+1

有更好的随机化方式,为什么不使用它们? – 2014-10-05 20:17:24

+7

这是关于你可以在C或者C++ 98/03中做的最好的。 C++ 11增加了一个新的''头,新的随机数生成功能大大改善了情况。 – 2014-10-05 20:18:46

+0

尽管如此,Boost在C++ 98中有更好的PRNG。 – chris 2014-10-05 20:23:00

回答

10

因为我看到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,以便批量模拟作业按预期/预期工作。

+2

当'/ 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

相关问题