首页 >后端开发 >C++ >为什么 C 中的 `` 库比 `rand()` 更受欢迎?

为什么 C 中的 `` 库比 `rand()` 更受欢迎?

DDD
DDD原创
2024-11-03 17:00:03183浏览

Why is the `` library in C   preferred over `rand()`?

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

当代关于 rand() 的担忧引发了关于利用高级随机数的讨论基于引擎分布范式的生成(RNG)过程,而不是传统的 std::rand() 和模方法。为了第一手了解 rand() 的缺点,进行了一个快速实验。

利用 std::rand() 和 std 创建了两个函数 getRandNum_Old() 和 getRandNum_New(): :mt19937 和 std::uniform_int_distribution 分别生成 0 到 5 之间的随机数。使用每种方法生成 960,000 个随机数,并记录每个数字(0-5)的频率。标准差作为衡量标准,值越低表明分布越均匀。该过程重复了 1000 次,并测量了每次迭代所需的时间。

令人惊讶的是,两种方法中的卷数分布相似。新方法大约慢了 4 倍。速度的提升似乎是以质量的最小提高为代价的。

然而,一个关键的区别在于 RNG 实现本身。许多 rand() 实现都采用线性同余生成器 (LCG),但它们通常不是最强大的。尽管它们很流行,但它们通常在进行的基本测试中产生可接受的结果。

低于标准的 rand() 实现的缺点包括低位随机性低、周期短、RAND_MAX 低以及连续序列之间的相关性提取物。然而,值得注意的是,这些限制并不是 rand() API 固有的。

rand() 的根本问题集中在:

  1. 向后兼容性:更改现有实现会破坏依赖于具有固定种子的 srand 的程序的可重复性。
  2. 简单接口:rand() 提供单个全局生成器。虽然适用于基本用例,但它在多线程应用程序和需要可重现序列的场景中提出了挑战。

新的库通过提供以下功能解决了这些问题:

  • 指定实现:交叉编译器可重现的输出和有保证的特性。
  • 最先进的生成器:封装在类中以避免全局状态问题。
  • 随机设备:播种设施。

性能方面,std::mt19937(在测试中由 std::rand() 使用)比 std::minstd_rand 慢( 库中也提供了 LCG)。使用 std::minstd_rand 以及与 getRandNum_Old() 类似的实现可以实现更快的执行速度(6 毫秒,而 rand() 为 8.61 毫秒)。

以上是为什么 C 中的 `` 库比 `rand()` 更受欢迎?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn