从NSArray中获取一个随机对象而不重复
我有一个17个对象的NSArray
,像这样:
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
得到一个随机对象,即使我closures了应用程序(也许通过使用NSUserDefaults
),而不会重复。
如果我已经得到所有的对象,我想为同一个对象生成一个新的随机序列。
你可以通过制作数组的可变副本来做到这一点,并从该数组中随机select后,删除同一个对象。 当你想保存数组,保存可变数组本身,所以可以恢复应用程序重新启动时停止的地方。 这个小testing应用程序就是这样做的,只logging随机select的值:
- (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; }
通过每个洗牌元素,当你到最后,洗牌。
当一个随机播放的最后一个项目与下一个随机播放的第一个项目相同时,仍可能发生连续两次select项目的情况。 如果你想避免这个,你必须添加一些额外的代码。
只需复制并粘贴
-(NSMutableArray*)getRandomValueFromArray:(NSMutableArray*)arrAllData randomDataCount:(NSInteger)count { NSMutableArray *arrFilterData = [[NSMutableArray alloc]init]; for(int i=0; i<count; i++){ NSInteger index = arc4random() % (NSUInteger)(arrAllData.count); [arrFilterData addObject:[arrAllData objectAtIndex:index]]; [arrAllData removeObjectAtIndex:index]; } return arrFilterData; }
注意: count
=你想要从数组中获取的随机值的数量。