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

Should I use rand() or rand_r()?

本文关键字:rand 还是 我应该      更新时间:2023-10-16

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

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

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

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

谁是对的?

两者都有。

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>标头中定义的特性。否则,请查阅系统文档以获取其他伪随机数生成器。

参考文献:cppreference.com上的POSIX、<random>

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

观察被S.T.L.认为有害的rand()