【问题标题】:Should I use rand() or rand_r()?我应该使用 rand() 还是 rand_r()?
【发布时间】:2015-05-22 00:15:14
【问题描述】:

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

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

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

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

谁是对的?

【问题讨论】:

  • 如果可能,请使用“新”<random> 设施。 rand 很糟糕。 Interesting.

标签: c++ cppcheck cpplint


【解决方案1】:

两者都有。

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()rand()。否则,如果您有可用的 C++11 实现,请使用 <random> 标头中定义的功能。否则,请查阅系统文档以了解其他伪随机数生成器。

参考:POSIX<random> on cppreference.com

【讨论】:

  • 可能值得注意的是,C++11 的随机性也存在于 Boost 中,供那些不会使用 C++11 但可以使用 Boost 的人使用。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2015-10-16
    • 2023-03-06
    • 2013-02-20
    • 2011-07-31
    • 2010-12-23
    相关资源
    最近更新 更多