int randomNumber = (arc4random() % 83) + 1;
这是生成“最随机”数字的最佳方法吗?还是有更好的方法生成随机数?
int randomNumber = (arc4random() % 83) + 1;
这是生成“最随机”数字的最佳方法吗?还是有更好的方法生成随机数?
当你使用arc4random
时,避免了使用线性同余生成器(即rand
常用的算法)与%
运算符相结合所存在的一个缺陷:低位比特不够随机。
然而,你仍然会遇到截断问题:即因为(1 << 32) % 83
等于77,这意味着0到76之间的数字(略微)比77到82之间的数字出现频率更高。为了避免这种情况,如果传入的值大于(1 << 32) / 83 * 83
,你应该舍弃这个值(即再次调用arc4random
)。
(我假设arc4random
的范围是从0到232-1。请相应地调整上述说明。)
arc4random
非常棒:它使用内核收集的熵和所有好东西。 - C. K. Youngarc4random
是加密级别的随机性。它相当于从 /dev/arandom
读取。因此,如果您正确处理随机性(并且不通过未经检查的方式使结果偏斜),则可以将其用于加密级别的内容。 - C. K. Youngarc4random使用基于当前时间的优秀算法生成随机数。还有其他rand函数,但它们不如arc4random好,并需要种子。
arc4random
也需要种子,它在第一次使用前会自动进行种子初始化。 - Joeyarc4random_uniform()
不会受到模数偏差的影响,对于不是2的幂次方的最大值来说,这是直接使用arc4random()
所存在的问题。 - Zev Eisenberg我见过的最好的随机数生成器(以及对“随机”含义非常清晰的定义)可以在斯蒂芬·沃尔夫勒姆的《新科学的一种新形态》中找到。他在他的Mathematica软件程序中使用了一个非常简单的元胞自动机作为他的随机数生成器,因此它已经经过了极其严格的测试。