我应该使用rand()还是rand_r()
Should I use rand() or rand_r()?
我试图在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()
相关文章:
- enum是C++中的宏变量还是整数变量
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 在命名空间中定义函数还是限定函数
- 架构决策:返回std::future还是提供回调
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 异常属于C++中的线程还是进程
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 如何在C++中确定文本文件中的元素是字符还是数字
- 为什么我不能将 rand() 与数组的大小一起使用?
- 返回值优化:显式移动还是隐式
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 为什么新的随机库比std::rand()更好
- 为什么需要知道一个类是平凡的还是有平凡的构造函数
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 为什么rand()的使用被认为是不好的
- 在这种情况下,我真的复制了字节还是复制了字符?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 我应该使用rand()还是rand_r()