Obtendo um object random do NSArray sem duplicação

Eu tenho um NSArray com 17 objects, algo assim:

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

e um int com um número random da seguinte forma:

 int random = arc4random()%17+1; 

Eu quero obter um object random deste NSArray sem que seja uma duplicata, mesmo se eu fechei o aplicativo (talvez usando NSUserDefaults ).

Se eu consegui todos os objects que eu quero gerar uma nova seqüência aleatória para os mesmos objects.

Você poderia fazer isso fazendo uma cópia mutável da matriz e depois de fazer uma seleção aleatória dessa matriz, remova esse mesmo object. Quando você deseja salvar a matriz, salve a matriz mutável, para que possa continuar de onde parou quando o aplicativo for reiniciado. Este pequeno aplicativo de teste faz isso e apenas registra o valor da escolha aleatória:

 - (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(@"*******************"); } } 

Como ponto de partida, você pode embaralhar sua matriz:

 + (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; } 

Passe por cada elemento embaralhado e, quando chegar ao fim, remonte.

Pode ainda acontecer que um item seja selecionado duas vezes seguidas quando o último item de um shuffle é o mesmo que o primeiro item no próximo shuffle. Se você quiser evitar isso, você terá que adicionar algum código adicional.

Basta copiar e colar

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

Nota: count = número de valores randoms que você deseja buscar na matriz.