正在使用 std::time 和 std::srand 有效代码

Is using std::time with std::srand valid code?

本文关键字:std srand 有效 代码 time      更新时间:2023-10-16

C++中写:

std::srand(std::time(nullptr));

还是这会产生未定义的行为?


std::time返回一个算术类型的std::time_t,但未指定。根据我的理解,算术类型是任何浮点,整数和字符类型。

std::srandunsigned int作为种子值。

因此,我认为您不能严格执行此转换。我在符合 POSIX 的系统上读到,std::time_t是积分,是自 1970 年 1 月 1 日 00:00 UTC 以来的秒数。在这种情况下,转换可能需要从有符号转换为无符号,这是一个实现定义的转换,但应该没问题,以及从较大的整数转换为较小的整数类型,这对于种子来说也很好。

你是对的,time_t可能是一个浮点类型,如果截断值的结果不能表示为unsigned int,那么行为是未定义的([conv.fpint]/1)。

如果你想以符合标准的方式生成随机数,我建议使用 C++11 <random>设施。您可以从 std::random_device 中播种 RNG 的种子。例如,请参阅 https://stackoverflow.com/a/19666713/481267