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

編集:

Ok。何か馬鹿げたものを投稿しないように、いくつかのテストコードを実行したかった。:) 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

これは、ほぼいわゆるフィッシャー-イェーツアルゴリズムです。何も割り当てないため、時間計算量とメモリ効率はそれほど高くないため、O(n)です。

私が変更する唯一のことは、範囲[0, i]全体ではなく、i番目の反復の範囲内にあるランダムに選択されたインデックスです(2つの要素を2回交換することを避けるため)、それは私がリンクしたアルゴリズムになります。

于 2012-06-05T23:22:37.713 に答える