【问题标题】:In C language, what is the speed difference between Call Rand() and RdRand?在 C 语言中,Call Rand() 和 RdRand 的速度有什么区别?
【发布时间】:2015-07-24 03:53:30
【问题描述】:

在我之前的问题“What algorithm is Rand() based on in C language?”之后,我想知道函数算法的原因是我想比较它与RdRand的速度差异。

我尝试循环它一亿次并计算它的运行时间。

通常,使用硬件创建随机数 (RdRand) 会使其速度更快,但结果显示相反(Rand() 3sec V.S. RdRand 10sec)。

有人可以帮我解决这个问题吗?

谢谢一百万!

【问题讨论】:

  • 当 RdRand 具有强大的加密能力并且 Rand 是一个简单的 LCG 计算时,为什么它会更快?
  • 我不确定这是否是骗局,但无论如何它似乎都会包含您感兴趣的信息:stackoverflow.com/questions/26771329/…
  • 这里有更多关于 RDRAND 性能的讨论:stackoverflow.com/questions/10484164/…
  • rand() 的历史版本是一个非常差的线性同余生成器,其中低位特别远离随机。但它非常快:只是一个整数乘法、加法和位掩码。通常对于游戏来说已经足够了。否则不要使用它。 man7.org/linux/man-pages/man3/rand.3.html 有一些上下文。任何加密质量的 rng 都可能比 rand 慢很多,这仅仅是因为它做了更多的扰码工作。

标签: c algorithm random rdrand


【解决方案1】:

硬件方法并不总是比软件方法快。

look here 对您来说可能很有趣,这是 glibc 的 sin 函数与 Intel 的 fsin 指令相比,后者在大多数情况下更准确、更快。

每个实现都有自己的优缺点。 RdRand 主要关注的是:

随机数生成器符合 NIST SP 800-90A、[4] FIPS 140-2 和 ANSI X9.82 等安全和加密标准。 --- RdRand, Wikipedia

因此,您可以使用 RdRand 并确保它的安全性,而如果您需要快速随机生成并且安全性无关紧要。您可以简单地使用 glibc 的 rand()。

【讨论】:

  • 安全并不是您想要高质量 RNG 的唯一原因。其他示例用途是在游戏中获得良好的掷骰分布,或模拟退火中的抖动源。
  • RNG 的行为难以预测并被称为安全(更正式的解释 here)与 RNG 的分布之间存在差异。 rand() 概率分布是均匀的,并且很容易从中制作其他分布 (Look here)。
  • 返回序列{0,1,2,3,4,...,2^32-1} 也是均匀分布,但生成器会很糟糕。 rand 还不错,但也不是很好。 glibc 特别糟糕,因为(根据维基百科)它暴露了具有特别差的属性的生成值的低位。
  • 是的,它并不完美,但足以解决许多问题,而且它对许多问题(如安全性或随机性质量至关重要的问题)都不好。也感谢讨论! :) 它让我读到了很多以前不知道的东西!
猜你喜欢
  • 2015-04-30
  • 1970-01-01
  • 2017-01-09
  • 2021-03-24
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多