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

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

4

3 回答 3

13

当您使用时,arc4random您可以避免使用%线性同余生成器(这是 使用的常用算法rand)的一个陷阱:低位的随机性并不低。

但是,您仍然有截断问题:即,因为(1 << 32) % 83是 77,这意味着 0 和 76 之间的数字比 77 和 82 之间的数字出现(稍微)更频繁。为避免这种情况,您应该丢弃传入的值(即调用arc4random再次)如果它在上面(1 << 32) / 83 * 83

(我假设 的范围arc4random是从 0 到 2 32 -1。相应地调整上述解释。)

于 2010-12-14T04:48:25.397 回答
9

arc4random 具有基于当前时间生成随机数的高级算法。还有其他 rand 函数,但它们没有那么好,需要播种。

于 2010-12-14T04:36:36.637 回答
2

我见过的最好的随机数生成器(以及对随机含义的非常清晰的定义)可以在 Stephen Wolfram 的 A New Kind of Science 中找到。几十年来,他一直在他的 Mathematica 软件程序中使用一个非常简单的元胞自动机作为他的随机数生成器,因此它经过了非常好的测试。

于 2012-07-19T20:13:44.017 回答