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

时间:2015-03-19 00:26:41

标签: c++

我试图在C ++中使用rand()来获取随机数。这就是cpplint所说的:

  

考虑使用rand_r(...)代替rand(...)来提高线程安全性。

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

  

过时的功能' rand_r'调用。建议使用' rand'代替。

谁是对的?

2 个答案:

答案 0 :(得分:13)

两者都有。

rand()函数由C标准定义,并且自1989/1990年第一个这样的标准以来一直存在;它在C ++标准中被引用。由于rand()取决于状态,因此它不是线程安全的。

rand_r()函数被设计为rand()的线程安全替代品。它是由ISO C或C ++标准定义。它由POSIX.1-2001定义,但被POSIX.1-2008标记为过时(意味着它仍然由POSIX标准定义,但可能在将来的版本中删除)。

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

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

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

答案 1 :(得分:1)

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

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