возможная ошибка логики массива

У меня есть массив, который я произвожу. Я не смог повторить это, но пользователь моего приложения сообщил, что у него возникла ситуация, когда один из элементов массива произошел дважды, а другой - совсем. Глядя на логику ниже, есть ли что-нибудь об этом, которое может вызвать эту проблему в определенных ситуациях?

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 ja de
Вы уверены, что tempNSArray не содержит повторяющихся элементов?
добавлено автор Martin R, источник
@ reid55: strArray является случайной перестановкой tempNSArray . Он содержит те же элементы в другом порядке. Если tempNSArray имеет дублирующий элемент, то strArray будет иметь тот же дублирующий элемент.
добавлено автор Martin R, источник
Я проверил номер 100000, который он никогда не повторяет .... tempNSArray должен быть уникальным, как сказал мой Мартин Р.
добавлено автор Anoop Vaidya, источник
@ reid55 Эта ссылка получила именно то, что вы хотите. Хотя способ, показанный в этом ответе, подобен тому, как вы это сделали, есть несколько важных различий, которые могут иметь для вас всю разницу.
добавлено автор trudyscousin, источник
Нет никакого отношения к Xcode. Retagged.
добавлено автор user529758, источник
Да, я вижу это, но я не понимаю, как это может вызвать проблему.
добавлено автор reid55, источник
tempNSArray может и иногда иметь повторяющиеся элементы. Как это будет проблемой? Фактически, в ситуации, когда возникла проблема, tempNSArray имел дублирующие элементы, хотя элемент, который был ошибочно дублирован, не был дубликатом a в исходном массиве.
добавлено автор reid55, источник
@trudyscousin: Проблема, с которой я сталкиваюсь с подходом, используемым в ссылке выше, заключается в том, что вы никогда не можете рандомизировать индекс, меньший, чем индекс рандомизированного элемента. Это не похоже на действительно случайный подход ко мне.
добавлено автор reid55, источник

1 ответы

попытайтесь создать новый NSMutableArray с содержимым массива tempNSArray и когда вы выберете случайный объект удаляет его до тех пор, пока новый 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
добавлено