如何在iPhone或iPad上获得高质量的随机数?

时间:2011-02-05 14:49:23

标签: iphone ios random

我知道arc4random()被认为是随机性的最佳选择之一。但是,它往往会在某些时候给出明显的重复和重复。

我想过使用加速度计为arc4random的输出添加一些真正的随机性。在我花费几周时间开发更好的解决方案之前:还有哪些其他解决方案?

5 个答案:

答案 0 :(得分:6)

预期来自随机数字流的重复和重复。不需要尝试添加“更多随机性”; arc4random已经从/ dev / urandom读取,它从系统中的各种来源收集熵。

答案 1 :(得分:5)

如果你试图摆脱重复和重复(特别是来自长度小于数百万的arc4random序列),你可能最终会得到一个更少随机的序列。期望在真正的随机性中减少重复是一种常见的人类心理错误。

如果你不想为某种目的重复,你应该随机排序一个没有重复元素的数组,就像在洗牌中一样。

答案 2 :(得分:4)

在回答你的实际问题时,如果你想要比arc4random()更好的东西,请查看

mersenne twister
从某种意义上讲,它“更好”。希望它有所帮助!


我还敦促任何对这个主题不熟悉的人阅读关于堆栈溢出的最着名的答案之一,这可以很好地解释发行版,甚至是图表!

Understanding "randomness"

从不添加或增加随机数以试图获得”更好“的随机性,”是短版本。

答案 3 :(得分:2)

如果您希望“看似”随机循环浏览列表并避免重复任何项目...请使用arc4random()并在查看每个项目后将其从列表中删除。当列表运行干燥时,重新加载它。

例如:

if (!self.dictionaryValues) {
[self loadList];

}其他{

NSMutableDictionary *unusedValueList = [[NSMutableDictionary alloc] initWithDictionary:self.dictionaryValues];

int random = arc4random()%[self.dictionaryValues count]; // note, crashes on nil;
int i=0;
for (NSString *key in self.dictionaryValues) {
        i++;
        if (i == random) {
            NSLog(@"MATCH! on key=%@", key);
            [unusedValueList removeObjectForKey:key];
        }
}
self.dictionaryValues = nil;
self.dictionaryValues = unusedValueList;

}

希望这有帮助!

答案 4 :(得分:0)

我在这里有一个很长的答案,但我只想链接到这个。因为它基本上总结了试图使随机数“更随机”的所有错误

http://thedailywtf.com/Articles/More-Entropy,-Please.aspx