从NSArray中获取不重复的随机对象

5

我有一个包含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中获取一个随机对象,而且它不会是重复的,即使我关闭了应用程序(可以使用NSUserDefaults)。

如果我已经获取了所有要生成的对象,则可以为相同的对象生成新的随机序列。

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(@"*******************");
    }
}

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;
}

逐个遍历每个随机元素,当到达末尾时重新洗牌。

即使在洗牌过程中,当一个洗牌的最后一个元素和下一个洗牌的第一个元素相同时,仍然可能会选择两次该项。如果您想避免这种情况,您需要添加一些额外的代码。


我尝试了这个想法,但是我有重复的对象被调用了。顺便说一下,我的一个对象“XXX”被连续三次使用了这种方法。 - Mutawe
@Mutawe 如果你洗牌数组,然后按顺序遍历对象,就不需要随机选择了。 - Greg
现在我有一个打乱顺序的数组,但是我能做什么呢?将它存储在NSUserDefaults中吗?存储从1到17的计数,如果计数== 17,则重新洗牌? - Mutawe

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接