为什么rand()比arc4random()快得多?

时间:2017-05-28 19:20:56

标签: c random bsd arc4random

我正在编写一个需要快速整数随机数生成的游戏AI。此游戏适用于Mac OS,因此有两种选择rand()(普通C)和arc4random()(BSD)。我没有找到这两个函数的速度比较,所以我写了一个小程序来测试:

long i;

// Record timestamp here.
srand((unsigned int)time(NULL));
for (i = 0; i < 999999999; ++i) {
    rand();
}
// Record timestamp here.
for (i = 0; i < 999999999; ++i) {
    arc4random();
}
// Record timestamp here and print all three.

我测试了好几次。结果非常稳定:srand()和999999999 rand()的迭代大约需要6 s,而arc4random()需要更长的时间(大约30 s)。

arc4random()是否需要更长的时间?或者我的测试中有任何缺陷。谢谢!

1 个答案:

答案 0 :(得分:3)

您的结果是合理的。

这两个函数是为不同目的而设计的,它们基于完全不同的伪随机数生成器类。

rand() pseudorandom number generator(PRNG),通常以linear congruential generator(LCG)的形式实施,但速度相当快,但通常它的统计数据非常糟糕属性。

arc4random() cryptographically secure pseudorandom number generator(CSPRNG),它通常较慢但也适合加密使用,这意味着它具有比PRNG更高的随机性统计质量。根据文件hereherehere

  

最初在OpenBSD中实现的功能,使用了RC4   密码生成输出流。 OpenBSD现在使用ChaCha20   流密码。

  

RC4由RSA Data Security,Inc。设计。它是匿名发布的   到USENET并被证实相当于几个   有权访问原始密码的来源。由于RC4曾经是一个   商业秘密,密码现在称为ARC4。

了解两类伪随机数生成器之间的区别非常重要。

PRNG 旨在满足您所关注的所有(理想情况下)大量统计随机性的目的:您希望模拟随机性的字段。

CSPRNG 的设计目的是后者根本不够,但也需要大量的不可预测性(即使知道生成器算法):密码学领域。

因此,您不需要CSPRNG来生成具有高质量统计随机性的数字。您所需要的只是高品质的PRNG。 <{1}}无处可去,rand()是一个过冲。

有关简单,现代,高质量的随机数生成器,请参阅this页面。