对于iOS卡游戏,这种改组算法是否足够随机?

时间:2012-06-05 23:17:40

标签: objective-c cocoa-touch categories

不想发帖,“嘿,伙计们,你能为我提出一个很棒的随机化方法吗?”所以我一直在研究用于改组一副扑克牌的算法,创造真正的随机排列等等,所有这一天都很长,并且它一直是令人生畏的。最后确定了一种更简单的方法,如下所示。当然,我确实想创建一个高质量的游戏,但我不打算在网上赌场或任何东西中使用这种算法。这只是一款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];
    }
}

1 个答案:

答案 0 :(得分:3)

这几乎就是所谓的Fisher-Yates algorithm,它是O(n),因为你没有分配任何东西,因此时间复杂度和记忆效率并不高。

我唯一要改变的是随机选择的索引,它在第i次迭代的范围[0, i]而不是整个范围(为了避免只交换两个元素两次),然后它将成为我链接的算法。