首页 > 后端开发 > C++ > 正文

新的随机库真的比'std::rand()”更好吗?

Susan Sarandon
发布: 2024-10-31 07:03:30
原创
537 人浏览过

Is the New Random Library Really Better Than `std::rand()`?

为什么新的随机库比 std::rand() 更好?

在著名的演讲“rand() 被认为是有害的”中,使用引擎分布提倡随机数生成范例,而不是经典的 std::rand() 加模简化。

为了测试所提出的主张,进行了一个实验,将 std::rand() 与 std::mt19937 加 std:: 进行比较进行了uniform_int_distribution:

  1. 两个函数getRandNum_Old和getRandNum_New,被设计用于使用这两种方法生成0到5之间的随机数。
  2. 使用这两种方法生成了960,000个随机数,并统计数字 0-5 的频率。
  3. 计算了 1000 次模拟的频率标准偏差。
  4. 还记录了两种方法所花费的时间。

令人惊讶的是,两种方法的总滚动分布相同,这表明 std::mt19937 加上 std::uniform_int_distribution 没有提供任何额外的均匀性。然而,新方法大约慢了 4 倍。

虽然这个实验似乎表明 std::rand() 不一定较差,但重要的是要考虑 std::rand() 的固有局限性:

  • 它使用线性同余生成器 (LCG),已知该生成器表现出某些弱点,例如低位随机性低、周期短和有限的 RAND_MAX。
  • srand 接口限制了起始种子(以及由此生成的序列)的数量,因为它需要一个无符号整数。

相比之下,新的; C 标准库中的头文件:

  • 提供具有保证特性的完全指定的算法。
  • 将生成器封装在类中,消除全局状态和相关问题。
  • 包括用于播种的默认 random_device。
  • 如果需要,允许实现自定义生成器。

在性能方面,建议 std::minstd_rand 可能是 std 的合适替代品::mt19937 当 LCG 质量足够时,可能会提供更好的速度(特别是在避免使用uniform_int_distribution进行分布调整时)。

最终,随机数生成器的选择取决于应用程序的具体要求,但新的<随机>与传统的 std::rand() 实现相比,该库提供了多个优势,特别是对于需要高质量随机数的应用程序。

以上是新的随机库真的比'std::rand()”更好吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板