Получение случайного объекта из NSArray без дублирования

У меня NSArray с 17 объектами, примерно так:

 NSArray *objArray = [[NSArray alloc]initWithObjects: @"1",@"2",@"3",@"4",@"5",@"6" ,@"7",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17", nil]; 

и int со случайным числом следующим образом:

 int random = arc4random()%17+1; 

Я хочу получить случайный объект из этого NSArray не будучи дублирующимся, даже если я закрыл приложение (возможно, используя NSUserDefaults ).

Если у меня есть все объекты, я хочу создать новую случайную последовательность для тех же объектов.

Вы можете сделать это, сделав изменчивую копию массива, и после того, как вы сделаете случайный выбор из этого массива, удалите тот же самый объект. Если вы хотите сохранить массив, сохраните сам изменяемый массив, поэтому можете возобновить работу, когда вы остановились, когда приложение перезагрузится. Это небольшое тестовое приложение делает это и просто регистрирует значение случайного выбора:

 - (void)viewDidLoad { [super viewDidLoad]; self.objArray = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17"]; self.mut = [self.objArray mutableCopy]; } -(IBAction)pickNumber:(id)sender { int index = arc4random_uniform(self.mut.count); NSLog(@"%@", self.mut[index]); [self.mut removeObjectAtIndex:index]; if (self.mut.count == 0) { self.mut = [self.objArray mutableCopy]; NSLog(@"*******************"); } } 

В качестве отправной точки вы можете перетасовать массив:

 + (NSArray *)arrayByShufflingArray:(NSArray *)array { // Fisher-Yates algorithm NSMutableArray *result = [array mutableCopy]; NSUInteger count = [result count]; for (NSInteger i = ((NSInteger) count) - 1; i > 0; i--) { NSUInteger firstIndex = (NSUInteger)i; NSUInteger secondIndex = arc4random() % (NSUInteger)(i + 1); [result exchangeObjectAtIndex:firstIndex withObjectAtIndex:secondIndex]; } return result; } 

Шаг через каждый перетасованный элемент, и когда вы дойдете до конца, перетащите.

Может случиться так, что элемент выбирается дважды подряд, когда последний элемент одного тасования совпадает с первым элементом в следующем перемещении. Если вы хотите этого избежать, вам придется добавить дополнительный код.

Просто скопируйте и вставьте

 -(NSMutableArray*)getRandomValueFromArray:(NSMutableArray*)arrAllData randomDataCount:(NSInteger)count { NSMutableArray *arrFilterData = [[NSMutableArray alloc]init]; for(int i=0; i 

Примечание: count = количество случайных значений, которые вы хотите получить из массива.

Interesting Posts

Как отключить Cortana в Windows 10 или, по крайней мере, отключить результаты веб-поиска (для других пользователей)?

Как быстро открыть набор вкладок?

MySQL – Как SUM раз?

Что произойдет, если я оставлю выключенный ноутбук под прямым солнечным светом в течение нескольких часов?

Как получить доступ к командной строке администратора в Windows 8?

Перезаписывать конкретные разделы в методе записи данных в режиме искривления

Элемент списка избранных элементов Android ListView выделен

Запрос веб-страницы при загрузке файлов через ftp

Как остановить сайт для переопределения коротких сокращений на клавиатуре

SEL выполняет выбор и аргументы

Запустите файл jar с помощью планировщика окон

Почему перегрузка метода не допускается в WCF?

Есть ли способ найти все функции, открытые dll

Как использовать Powershell Remote через Интернет?

Зачем использовать @ Scripts.Render (“~ / bundles / jquery”)

Давайте будем гением компьютера.