正在使用 std::time 和 std::srand 有效代码
Is using std::time with std::srand valid code?
在
C++中写:
std::srand(std::time(nullptr));
还是这会产生未定义的行为?
std::time
返回一个算术类型的std::time_t
,但未指定。根据我的理解,算术类型是任何浮点,整数和字符类型。
std::srand
将unsigned int
作为种子值。
因此,我认为您不能严格执行此转换。我在符合 POSIX 的系统上读到,std::time_t
是积分,是自 1970 年 1 月 1 日 00:00 UTC 以来的秒数。在这种情况下,转换可能需要从有符号转换为无符号,这是一个实现定义的转换,但应该没问题,以及从较大的整数转换为较小的整数类型,这对于种子来说也很好。
你是对的,time_t
可能是一个浮点类型,如果截断值的结果不能表示为unsigned int
,那么行为是未定义的([conv.fpint]/1)。
如果你想以符合标准的方式生成随机数,我建议使用 C++11 <random>
设施。您可以从 std::random_device
中播种 RNG 的种子。例如,请参阅 https://stackoverflow.com/a/19666713/481267
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 正在使用 std::time 和 std::srand 有效代码
- Std::random_shuffle即使调用一次srand(time(0))也会产生相同的结果