我有一个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
中获取一个随机对象,而不是它是重复的。
如果我已经获得了所有对象,我想为相同的对象生成一个新的随机序列。
答案 0 :(得分:7)
您可以通过创建数组的可变副本来执行此操作,并在从该数组中进行随机选择后,删除该相同的对象。如果要保存数组,请保存可变数组本身,以便在应用程序重新启动时从中断处继续。这个小测试应用程序可以做到这一点,只记录随机选择的值:
- (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(@"*******************");
}
}
答案 1 :(得分:3)
作为起点,您可以随机播放阵列:
+ (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;
}
逐步浏览每个洗牌元素,当你走到尽头时,重新洗牌。
当一个shuffle的最后一个项与下一个shuffle中的第一个项相同时,仍然会连续两次选择一个项。如果你想避免这种情况,你将不得不添加一些额外的代码。
答案 2 :(得分:-1)
只需复制并粘贴
-(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
=要从数组中获取的随机值的数量。