我应该使用 rand() 还是 rand_r()?

Should I use rand() or rand_r()?

我试图在 C++ 中获取一个随机数,我正在使用 rand()cpplint 是这么说的:

Consider using rand_r(...) instead of rand(...) for improved thread safety.

我正在切换到 rand_r,这就是 cppcheck 所说的:

Obsolete function 'rand_r' called. It is recommended to use the function 'rand' instead.

谁是对的?

两者都有。

rand() 函数由 C 标准定义,自 1989/1990 年第一个此类标准以来一直如此;它通过引用包含在 C++ 标准中。由于 rand() 取决于状态,因此不是 thread-safe.

rand_r() 函数被设计为 thread-safe 替代 rand()。它是 不是 ISO C 或 C++ 标准定义的。它由 POSIX.1-2001 定义,但被 POSIX.1-2008 标记为过时(意味着它仍然由 POSIX 标准定义,但可能会在未来版本)。

rand() 的实施,因此 rand_r() 的实施质量可能较低。有更好的 pseudo-random 数字生成器。对于 C++,<random> 库是在 C++11 中添加的,并提供了许多不同的选项。

如果你想要最大的可移植性and你不会太在意生成数字的质量或可预测性andthread-safety 不是问题,您可以使用 srand()rand()。否则,如果您有可用的 C++11 实现,请使用 <random> header 中定义的功能。否则,请查阅您的系统文档以了解其他 pseudo-random 数字生成器。

参考文献:POSIX, <random> on cppreference.com.

使用 C++11 <random> 中的内容。

观看 S.T.L 的 rand() considered harmful