大多数时候我看到一个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/