c++ - 初始化 `rand()`的两种方式

标签 c++ static-cast srand

大多数时候我看到一个C伪随机数生成器的初始化,它是这样写的:

 srand(time(NULL));

无论如何我看到了 C++ 代码使用

srand(static_cast<unsigned int>(time(0)));

就初始化的优点而言,这两行是等价的,还是有理由更喜欢 C++ 中更冗长的方式?

最佳答案

std::time_t 的确切类型未指定。它通常是一个带符号的整数。 std::srand采用 unsigned(即 unsigned int)参数。

因此 std::time 返回的类型不匹配以及 std::srand 所期望的。根据 std::time_t 的确切类型,编译器可能会自动转换它,但也可能不会。

例如在 Windows 上使用 Visual C++ 编译器 time返回一个 64 位 整数。这不能很容易地转换为 unsigned int 而不损失精度,编译器可能(应该?我不记得了)对此发出警告。

因此进行强制转换,以确保将正确的类型传递给 std::srand


由于传递给 time 的参数不同,在 C++ 中,0 在标准化之前就可以隐式转换为空指针。 IIRC 现代 C(自 C99 以来?)也这样做,但情况并非总是如此。因此,C 中空指针的符号常量 NULL 和 C++ 中的整数常量 0

请注意,自 C++11 起,推荐的空指针为 nullptr .

关于c++ - 初始化 `rand()`的两种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48893952/

相关文章:

c++ - std::random_shuffle 产生相同的结果,即使 srand(time(0)) 被调用一次

c++ - T* 和常量 T*

c++ - 在 C++ 中释放双指针时出错

c++ - 奇怪的交叉转换。这怎么可能?

c++ - rand() 即使在 srand() 之后也产生相同的结果

c - 在 rollDice 函数中调用 srand(time(NULL)) 时出现问题

c++ - 特殊模板功能

c++ - 如果 make_shared/make_unique 可以抛出 bad_alloc,为什么为它设置一个 try catch block 不是一种常见的做法?

c++ - 派生类返回分配的基类实例

c++ - 如果派生类包含其他方法和成员,是否可以从基类到派生类进行static_cast?