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

16

我正在尝试在C++中获取随机数,我正在使用rand()。这是cpplint的建议:

考虑使用rand_r(...)而不是rand(...)以实现更好的线程安全性。

我转而使用rand_r,这是cppcheck的建议:

已调用过时函数'rand_r'。建议改用函数'rand'。

谁是对的?


6
如果可能的话,请使用“新”的<random>工具,而不是rand,因为rand表现较差。这里有一些有趣的内容。 - Baum mit Augen
2个回答

15

两者都可以使用。

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中。 - Morwenn

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接