配列ランダム化ロジック可能エラー

私はランダム化している配列を持っています。私はこれを再現することができませんでしたが、私のアプリのユーザーは、アレイの要素の1つが2回発生し、もう1つがまったく発生しないという状況を経験したと報告しています。下のロジックを見ると、特定の状況でその問題を引き起こす可能性のあるものはありますか?

NSMutableArray *strArray = [NSMutableArray arrayWithCapacity:18];
[strArray addObjectsFromArray:tempNSArray];
int randomIndex, arrayCount = [strArray count];
for (int i = 0; i < arrayCount; i++) {
    randomIndex = arc4random() % arrayCount;
    [strArray exchangeObjectAtIndex:i withObjectAtIndex:randomIndex];
}
1
nl ru de
tempNSArray に重複要素が含まれていないことを確認してください。
追加された 著者 Martin R,
@ reid55: strArray tempNSArray のランダムな順列です。同じ要素が異なる順序で含まれています。 tempNSArray に重複要素がある場合、 strArray は同じ重複要素を持ちます。
追加された 著者 Martin R,
私は繰り返さない100000の番号を調べました.... tempNSArrayは私のMartin Rと同じようにユニークでなければなりません。
追加された 著者 Anoop Vaidya,
@ reid55 このリンクには、あなたが望むものがあります。この回答に示されている方法は、あなたがそれを行ったやり方に似ていますが、あなたのためにすべての違いを生むことができるいくつかの重要な違いがあるようです。
追加された 著者 trudyscousin,
Xcodeとは全く関係ありません。再タグ付けされました。
追加された 著者 user529758,
はい、私はそれを見ますが、それがどのように問題を引き起こすのか分かりません。
追加された 著者 reid55,
tempNSArrayは重複した要素を持つことがあります。どのように問題になるでしょうか?事実、問題が発生した状況では、tempNSArrayは重複した要素を持っていましたが、誤って重複した要素は元の配列に重複していませんでした。
追加された 著者 reid55,
@trudyscousin:上のリンクで使用されているアプローチの問題は、ランダム化される要素のインデックスよりも小さいインデックスに決してランダム化できないということです。それは私にとって本当にランダムなアプローチのようには見えません。
追加された 著者 reid55,

1 答え

配列tempNSArrayの内容を持つ新しいNSMutableArrayを作成しようとします。 ランダムなオブジェクトは、新しいNSMutableArrayが空になるまでそれを削除します。 このコードを試してください:

NSMutableArray *strArray = [[NSMutableArray alloc]init];
NSMutableArray *tempMutableArray=[[NSMutableArray alloc]initWithArray:tempNSArray];

int randomIndex;
while ([tempMutableArray count]=!0){
    randomIndex = arc4random() % [tempMutableArray count];
    [strArray addObject:[tempMutableArray objectAtIndex:randomIndex]];
    [tempMutableArray removeObjectAtIndex:randomIndex];

}
1
追加された