int randomNumber = (arc4random() % 83) + 1;
这是生成“最随机”数字的最佳方式吗?还是有更好的方法来生成随机数?
int randomNumber = (arc4random() % 83) + 1;
这是生成“最随机”数字的最佳方式吗?还是有更好的方法来生成随机数?
当您使用时,arc4random
您可以避免使用%
线性同余生成器(这是 使用的常用算法rand
)的一个陷阱:低位的随机性并不低。
但是,您仍然有截断问题:即,因为(1 << 32) % 83
是 77,这意味着 0 和 76 之间的数字比 77 和 82 之间的数字出现(稍微)更频繁。为避免这种情况,您应该丢弃传入的值(即调用arc4random
再次)如果它在上面(1 << 32) / 83 * 83
。
(我假设 的范围arc4random
是从 0 到 2 32 -1。相应地调整上述解释。)
arc4random 具有基于当前时间生成随机数的高级算法。还有其他 rand 函数,但它们没有那么好,需要播种。
我见过的最好的随机数生成器(以及对随机含义的非常清晰的定义)可以在 Stephen Wolfram 的 A New Kind of Science 中找到。几十年来,他一直在他的 Mathematica 软件程序中使用一个非常简单的元胞自动机作为他的随机数生成器,因此它经过了非常好的测试。