Obteniendo un objeto aleatorio de NSArray sin duplicación

Tengo un NSArray con 17 objetos, algo como esto:

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

y un int con un número aleatorio de la siguiente manera:

 int random = arc4random()%17+1; 

Quiero obtener un objeto aleatorio de este NSArray sin que sea un duplicado, incluso si cerré la aplicación (quizás usando NSUserDefaults ).

Si obtuve todos los objetos, quiero generar una nueva secuencia aleatoria para los mismos objetos.

Usted puede hacer esto haciendo una copia mutable de la matriz, y después de hacer una selección aleatoria de esa matriz, elimine ese mismo objeto. Cuando desee guardar la matriz, guarde la misma matriz mutable, de modo que pueda continuar donde la dejó cuando se reinicie la aplicación. Esta pequeña aplicación de prueba hace eso, y simplemente registra el valor de la selección aleatoria:

 - (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 punto de partida, puedes mezclar tu 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; } 

Pase por cada elemento arrastrado y cuando llegue al final, reorganice.

Todavía puede suceder que un elemento se seleccione dos veces seguidas cuando el último elemento de una combinación aleatoria sea el mismo que el primer elemento en la reproducción aleatoria siguiente. Si desea evitar esto, deberá agregar un código adicional.

Solo copie y pegue

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

Nota: count = número de valores aleatorios que desea recuperar de la matriz.