1

不想只是发布,“嘿,伙计们,你能为我想出一个很棒的随机化方法吗?” 所以我整天都在研究洗牌、创建真正随机排列等的算法,这真的令人生畏。最后选择了一种更简单的方法,如下所示。虽然我确实想创建一个高质量的游戏,但当然,我不会在在线赌场或其他任何地方使用这个算法。这只是一个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];
    }
}
4

1 回答 1

3

这几乎就是所谓的Fisher-Yates 算法,它是 O(n),因为时间复杂度和内存效率并不可观,因为您不分配任何东西。

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

于 2012-06-05T23:22:37.713 回答