不想发帖,“嘿,伙计们,你能为我提出一个很棒的随机化方法吗?”所以我一直在研究用于改组一副扑克牌的算法,创造真正的随机排列等等,所有这一天都很长,并且它一直是令人生畏的。最后确定了一种更简单的方法,如下所示。当然,我确实想创建一个高质量的游戏,但我不打算在网上赌场或任何东西中使用这种算法。这只是一款iOS游戏。那么,这种随机/内存效率是否足够?或者我应该给这个更多的时间和精力? TIA
除此之外:每当我写“TIA”时,我想,“这就是非洲”,而不是“提前谢谢。”
@implementation NSMutableArray (Shuffle)
-(void)shuffle
{
for (int i = [self count] - 1; i > 0; i--) {
[self exchangeObjectAtIndex:(arc4random() % ([self count] - 1))
withObjectAtIndex:i];
}
}
@end
编辑:
确定。想要运行一些测试代码,所以我不发布一些愚蠢的东西。 :)在回应Adam和Nielsbot时,你推荐的更像这样的东西?
-(void)shuffle
{
for (int i = [self count] - 1; i > 0; i--) {
[self exchangeObjectAtIndex:(arc4random_uniform([self count] - 1))
withObjectAtIndex:i];
}
}
是吗?
重复它会有什么好处吗?
-(void)shuffle
{
for (int i = [self count] - 1; i > 0; i--) {
[self exchangeObjectAtIndex:(arc4random_uniform([self count] - 1))
withObjectAtIndex:i];
}
for (int i = [self count] - 1; i > 0; i--) {
[self exchangeObjectAtIndex:(arc4random_uniform([self count] - 1))
withObjectAtIndex:i];
}
}
答案 0 :(得分:3)
这几乎就是所谓的Fisher-Yates algorithm,它是O(n),因为你没有分配任何东西,因此时间复杂度和记忆效率并不高。
我唯一要改变的是随机选择的索引,它在第i次迭代的范围[0, i]
而不是整个范围(为了避免只交换两个元素两次),然后它将成为我链接的算法。