在 C++ 中这样写是合法的:
std::srand(std::time(nullptr));
或者这会产生未定义的行为吗?
std::time
返回 std::time_t
这是一种算术类型,但除此之外未指定。据我理解,算术类型是 float 、整数和字符类型中的任何一种。
std::srand
将 unsigned 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 .参见,例如, https://stackoverflow.com/a/19666713/481267
关于c++ - 是否将 std::time 与 std::srand 有效代码一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783054/