15

我正在尝试在 C++ 中获取一个随机数,并且我正在使用rand(). 这就是cpplint所说的:

考虑使用rand_r(...)而不是rand(...)提高线程安全性。

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

调用了过时的函数“rand_r”。建议改用函数“rand”。

谁是对的?

4

2 回答 2

14

两者,有点。

rand()函数由 C 标准定义,自 1989/1990 年第一个此类标准以来一直存在;它通过引用包含在 C++ 标准中。由于rand()依赖于状态,它不是线程安全的。

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

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

如果您想要最大的可移植性并且您不太关心生成的数字的质量或可预测性并且线程安全不是问题,您可以使用srand()and rand(). 否则,如果您有可用的 C++11 实现,请使用<random>标题中定义的功能。否则,请查阅系统文档以了解其他伪随机数生成器。

参考:POSIX<random>在 cppreference.com 上

于 2015-03-19T00:54:52.833 回答
1

使用来自<random>C++11 的东西。

观看rand()被 STL认为是有害的

于 2015-11-14T21:03:00.070 回答