Zhi*_* An 4 c random bsd arc4random
我正在编写一个需要快速整数随机数生成的游戏人工智能。该游戏适用于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.
Run Code Online (Sandbox Code Playgroud)
我测试了好几次。结果相当稳定:srand()999999999次迭代rand()大约需要6秒,而arc4random()需要更长的时间(大约30秒)。
有什么原因arc4random()需要更长的时间吗?或者我的测试有什么缺陷。谢谢你!
你的结果是合理的。
这两个函数是为不同的目的而设计的,并且它们基于完全不同类别的伪随机数生成器。
rand()是一个伪随机数生成器(PRNG),通常作为线性同余生成器(LCG)实现,其速度相当快,但通常具有众所周知的不良统计特性。
arc4random()是一种加密安全伪随机数生成器(CSPRNG),通常速度较慢,但也适合加密使用,这意味着它比 PRNG 具有更高的随机性统计质量。根据此处、此处和此处的文档:
该函数最初在 OpenBSD 中实现时,使用 RC4 密码来生成输出流。OpenBSD 现在使用 ChaCha20 流密码。
和
RC4 是由 RSA Data Security, Inc. 设计的。它被匿名发布到 USENET 上,并被多个有权访问原始密码的消息来源确认为等效的。由于 RC4 曾经是商业秘密,因此该密码现在称为 ARC4。
了解两类伪随机数生成器之间的区别非常重要。
PRNG专为您所关心的(理想情况下)大量统计随机性的目的而设计:您想要模拟随机性的字段。
CSPRNG的设计目的是后者根本不够,但还需要大量的不可预测性(即使生成器算法完全已知):密码学领域。
因此,您不需要 CSPRNG 来生成具有高质量统计随机性的数字。您所需要的只是一个高质量的 PRNG。rand()无处可去,并且arc4random()是超调。
请参阅此页面了解简单、现代、高质量的随机数生成器。