int randomNumber = (arc4random() % 83) + 1;
这是产生“最随机”数字的最佳方式吗?或者有更好的方法来生成随机数吗?
答案 0 :(得分:13)
当你使用arc4random
时,你避免了使用%
和线性同余生成器(这是rand
使用的常用算法)的一个陷阱:低阶位不小于随机的。
但是,你仍然有截断问题:即,因为(1 << 32) % 83
是77,这意味着0到76之间的数字(略微)比77和82之间的数字更频繁出现。为了避免这种情况,你应该抛出远离传入值(即再次调用arc4random
),如果它高于(1 << 32) / 83 * 83
。
(我假设arc4random
的范围是从0到2 32 -1。相应地调整上述说明。)
答案 1 :(得分:9)
arc4random具有基于当前时间生成随机数的优越算法。还有其他兰特功能,但它们不太好,需要播种。
答案 2 :(得分:2)
我见过的最好的随机数发生器(以及对随机意义的非常明确的定义)可以在斯蒂芬沃尔夫勒姆的新科学中找到。他在Mathematica软件程序中使用了一个非常简单的元胞自动机作为他的随机数生成器几十年,所以它经过了极好的测试。