我正在编写一个需要快速整数随机数生成的游戏 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 秒,而 arc4random() 需要更长的时间(大约 30 秒)。
arc4random() 需要更长的时间有什么原因吗?或者我的测试有什么缺陷。谢谢!

最佳答案

您的结果是合理的。

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

rand() 是一个 pseudorandom number generator (PRNG),通常作为 linear congruential generator (LCG) 实现,它相当快,但通常它具有众所周知的糟糕的统计特性。

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







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

PRNG 旨在用于您关心的是(理想情况下)大量统计随机性的目的:您想要模拟随机性的字段。

CSPRNG 设计用于后者根本不够的用途,但还需要高度的不可预测性(即使生成器算法完全已知):密码学领域。

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

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

关于c - 为什么 rand() 比 arc4random() 快得多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44231133/

10-11 17:52