初始化 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
。
大部分时间看到的是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
。