c++ - 是否将 std::time 与 std::srand 有效代码一起使用?

标签 c++ language-lawyer

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

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

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


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

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 .参见,例如, https://stackoverflow.com/a/19666713/481267

关于c++ - 是否将 std::time 与 std::srand 有效代码一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783054/

相关文章:

c++ - 如何在链表的索引处插入一个值? c++段错误错误

c++ - 讨论为什么没有内联虚函数

c++ - 在 map 中使用 std::thread::id 以获得线程安全

c++ - Asio C++ 库 : asio/detail/config. hpp:没有这样的文件或目录

c++ - 名称查找 : downsides to using unqualified class name inside a class definition/omitting template parameters?

c++ - 如何使用模板表达成员之间的约束?

c++ - 为什么 C++ 链接器允许未定义的函数?

c++ - 嵌套名称说明符中的类型不完整

c++ - 强制常量数据保存在RAM中而不是ROM中

c - 用移位提取符号位