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

Mic*_*rus 5 c++ language-lawyer

写C++是合法的:

std::srand(std::time(nullptr));
Run Code Online (Sandbox Code Playgroud)

或者这会产生不确定的行为吗?


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

std::srandunsigned int一个种子值.

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

Bri*_*ian 4

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

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