使用 std::time 和 std::srand 有效代码吗?

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

在 C++ 中这样写是合法的:

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

或者这会产生未定义的行为吗?


std::time returns a std::time_t 这是一个算术类型,但除此之外未指定。根据我的理解,算术类型是浮点数、整数和字符类型中的任何一种。

std::srandunsigned int 作为种子值。

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

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

如果您想以符合标准的方式生成随机数,我建议使用 C++11 <random> 工具。您可以从 std::random_device 播种 RNG。请参见,例如,