从NSArray获取随机对象而不重复

时间:2013-05-28 11:50:43

标签: objective-c cocoa random duplicates 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中获取一个随机对象,而不是它是重复的。

如果我已经获得了所有对象,我想为相同的对象生成一个新的随机序列。

3 个答案:

答案 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 =要从数组中获取的随机值的数量。