初始化 rand() 的两种方式

Two ways of initializing `rand()`

大部分时间看到的是C伪随机数生成器的初始化,内容如下:

 srand(time(NULL));

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

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

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

std::time_t is unspecified. It is usually a signed integer. std::srand 的确切类型采用 unsigned(即 unsigned int)参数。

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

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

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


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

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