【问题标题】:Is srand(time(NULL)) bad?srand(time(NULL)) 不好吗?
【发布时间】:2014-11-30 03:43:06
【问题描述】:

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

既然我看到srand(time(NULL)) 如此流行(甚至在这个网站上),是否应该劝阻它?

【问题讨论】:

  • 有更好的随机化方法,为什么不使用它们呢?
  • 这是您在 C 甚至 C++ 98/03 中可以做到的最好的。 C++11 添加了新的 <random> 标头,具有新的随机数生成功能,大大改善了这种情况。
  • @DavidHeffernan 请列举几个。
  • @user1095108 从random 标头中声明的功能开始
  • 简短回答:在玩具程序中使用它,不要将它用于您要发布的任何内容或用于任何重要应用程序。

标签: c++ random srand


【解决方案1】:

既然我看到 srand(time(NULL)) 如此流行(甚至在这个网站上),是否应该劝阻它?

这取决于您希望如何使用生成器的输出(在本例中为rand() 的输出)。

如果您的程序的单次运行只需要均匀分布,那么srand(time(NULL)) 就可以了。这在您只需要快速均匀分布数字的模拟中是可以接受的。

如果您想提交一个批处理作业,以便您的程序的多个实例同时运行(并且同时有效地启动),那么srand(time(NULL)) 可能会导致一个或多个实例产生相同的随机流。

如果您需要安全输出,那么您应该使用srand(time(NULL)),因为它通常是一个线性同余生成器 (LCG)。琼博亚尔多年前就教我们如何打破它们。见Inferring sequences produced by a linear congruential generator missing low-order bits

至于time_t 的问题,如果time_t 太大,只需将其折叠以适应srand 期望的参数即可。您甚至可以折叠进程 PID,以便批量模拟作业按预期/预期工作。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-07-25
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多