我正在编写一个需要快速整数随机数生成的游戏 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 具有更高的随机统计质量。根据文档 here 、 here 和 here :
和
了解两类伪随机数生成器之间的区别很重要。
PRNG 旨在用于您关心的是(理想情况下)大量统计随机性的目的:您想要模拟随机性的字段。
CSPRNG 设计用于后者根本不够的用途,但还需要高度的不可预测性(即使生成器算法完全已知):密码学领域。
因此,您不需要 CSPRNG 来生成具有高质量统计随机性的数字。您只需要一个高质量的 PRNG。 rand()
无处可去,arc4random()
是一个过冲。
有关简单、现代、高质量的随机数生成器,请参阅 this 页面。
关于c - 为什么 rand() 比 arc4random() 快得多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44231133/