arc4random随机数生成器

4
int randomNumber = (arc4random() % 83) + 1;

这是生成“最随机”数字的最佳方法吗?还是有更好的方法生成随机数?


你可以参考这个问题:https://dev59.com/dFDTa4cB1Zd3GeqPJoK7#3724668 - Girish Kolari
3个回答

13

当你使用arc4random时,避免了使用线性同余生成器(即rand常用的算法)与%运算符相结合所存在的一个缺陷:低位比特不够随机。

然而,你仍然会遇到截断问题:即因为(1 << 32) % 83等于77,这意味着0到76之间的数字(略微)比77到82之间的数字出现频率更高。为了避免这种情况,如果传入的值大于(1 << 32) / 83 * 83,你应该舍弃这个值(即再次调用arc4random)。

(我假设arc4random的范围是从0到232-1。请相应地调整上述说明。)


1
@Joe Blow:OP要求“最好”的随机数生成系统通常是可用的,所以我在回答这个问题。此外,arc4random非常棒:它使用内核收集的熵和所有好东西。 - C. K. Young
1
@Joe Blow:实际上,arc4random 是加密级别的随机性。它相当于从 /dev/arandom 读取。因此,如果您正确处理随机性(并且不通过未经检查的方式使结果偏斜),则可以将其用于加密级别的内容。 - C. K. Young
现在,arc4中已经有许多众所周知的偏差。例如,http://www.worldlingo.com/ma/enwiki/en/RC4 “RC4生成的密钥流在不同程度上对某些序列存在偏向。” 这就是为什么您不能将arc4用于例如科学重要的MC模拟的原因。 - Fattie

9

arc4random使用基于当前时间的优秀算法生成随机数。还有其他rand函数,但它们不如arc4random好,并需要种子。


3
arc4random 也需要种子,它在第一次使用前会自动进行种子初始化。 - Joey
Rand和类似的函数不能像arc4random那样产生如此广泛的范围。 - prgmast3r
1
arc4random_uniform()不会受到模数偏差的影响,对于不是2的幂次方的最大值来说,这是直接使用arc4random()所存在的问题。 - Zev Eisenberg

2

我见过的最好的随机数生成器(以及对“随机”含义非常清晰的定义)可以在斯蒂芬·沃尔夫勒姆的《新科学的一种新形态》中找到。他在他的Mathematica软件程序中使用了一个非常简单的元胞自动机作为他的随机数生成器,因此它已经经过了极其严格的测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接