使用 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::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。请参见,例如,
在 C++ 中这样写是合法的:
std::srand(std::time(nullptr));
或者这会产生未定义的行为吗?
std::time
returns a std::time_t
这是一个算术类型,但除此之外未指定。根据我的理解,算术类型是浮点数、整数和字符类型中的任何一种。
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。请参见,例如,