5

我有NSArray17 个对象,如下所示:

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)。

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

4

3 回答 3

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(@"*******************");
    }
}
于 2013-05-28T15:30:36.817 回答
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 中的第一项相同时,仍然可能会连续选择一个项目两次。如果你想避免这种情况,你必须添加一些额外的代码。

于 2013-05-28T11:59:18.563 回答
-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= 要从数组中获取的随机值的数量。

于 2015-04-02T17:25:05.100 回答