Objective c 从计数为6的NSArray中选择4个随机元素

Objective c 从计数为6的NSArray中选择4个随机元素,objective-c,nsarray,Objective C,Nsarray,我是目标C的新手。我正在为游戏策划人编写代码,电脑从6种颜色中选择4种随机颜色,用户尝试在6次尝试中猜出4种颜色 我有一个NSArray来表示这里所有六种可能的颜色: NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil]; //Computer choose 4 random colors: NSArray * computersS

我是目标C的新手。我正在为游戏策划人编写代码,电脑从6种颜色中选择4种随机颜色,用户尝试在6次尝试中猜出4种颜色

我有一个NSArray来表示这里所有六种可能的颜色:

    NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil];

    //Computer choose 4 random colors:

    NSArray * computersSelection = [[NSArray alloc] init];
我需要编写代码从数组中选择4种独特的随机颜色。有没有一个聪明的方法可以做到这一点

我可以创建四个int变量,使用while循环生成四个随机数,然后根据四个随机整数值从NSArray中提取对象,并将它们放入computerSelection数组,但我想知道是否有更简单的方法


由于初始数组是固定的,因此确保唯一值的相对简单的方法是删除对象而不是选择对象。在这种情况下,去掉两个,就得到了一个四个的数组,唯一性得到了保证。以下是基本代码:

    NSArray *allColors = @[@"r", @"g", @"b", @"y", @"p", @"o"];
    NSMutableArray *fourColors = [allColors mutableCopy];
    [fourColors removeObjectAtIndex:arc4random_uniform((u_int32_t)(fourColors.count + 1))];
    [fourColors removeObjectAtIndex:arc4random_uniform((u_int32_t)(fourColors.count + 1))];
    NSLog(@"%@", fourColors);

由于初始数组是固定的,因此确保唯一值的相对简单的方法是删除对象而不是选择对象。在这种情况下,去掉两个,就得到了一个四个的数组,唯一性得到了保证。以下是基本代码:

    NSArray *allColors = @[@"r", @"g", @"b", @"y", @"p", @"o"];
    NSMutableArray *fourColors = [allColors mutableCopy];
    [fourColors removeObjectAtIndex:arc4random_uniform((u_int32_t)(fourColors.count + 1))];
    [fourColors removeObjectAtIndex:arc4random_uniform((u_int32_t)(fourColors.count + 1))];
    NSLog(@"%@", fourColors);
这是我的尝试。但我还是更喜欢上面@jshier的回答


这是我的尝试。但我还是更喜欢上面@jshier的回答

保留原始源列表:

NSUInteger const kChoiceSize = 4;
NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil];

NSMutableSet *choice = [[NSMutableSet alloc] init];
while ([choice count] < kChoiceSize) {
    int randomIndex = arc4random_uniform([allColors count]);
    [choice addObject:[allColors objectAtIndex:randomIndex]];
}

保留原始源列表:

NSUInteger const kChoiceSize = 4;
NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil];

NSMutableSet *choice = [[NSMutableSet alloc] init];
while ([choice count] < kChoiceSize) {
    int randomIndex = arc4random_uniform([allColors count]);
    [choice addObject:[allColors objectAtIndex:randomIndex]];
}

那么,这个作业什么时候交?显然是作业,我觉得这样的问题没问题。海报展示了他们对所做工作的充分了解,并要求提供补充信息,以提高他们的知识水平。那么,作业什么时候到期?虽然显然是作业,但我觉得这样的问题还可以。海报显示了他们对所做工作的充分了解,并要求提供补充信息以提高他们的知识水平。您能提供更多信息吗?我的笔记说,除非对象是NSMutableArray,否则不能将其添加或删除到NSArray。那么如何从AllColor中删除?哦,现在我明白了!您正在创建一个可变副本!美好的这很有创意。我也在下面发布了我的解决方案,但你的更好。你能提供更多信息吗?我的笔记说,除非对象是NSMutableArray,否则不能将其添加或删除到NSArray。那么如何从AllColor中删除?哦,现在我明白了!您正在创建一个可变副本!美好的这很有创意。我也在下面发布了我的解决方案,但你的更好。这是一种非常糟糕的选择不匹配随机数的方法。性能可能会很糟糕。您对如何检查唯一匹配的数字有更好的建议吗?这是一种非常糟糕的选择非匹配随机数字的方法。性能可能会很差。关于如何检查唯一匹配号码,您有更好的建议吗?