从计数6的NSArray中挑选4个随机元素

时间:2013-10-02 02:32:00

标签: objective-c nsarray

我是Objective C的新手。我正在编写游戏Mastermind,计算机从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数组中,但我想知道是否有更简单的方法做事?

由于

3 个答案:

答案 0 :(得分:4)

确保唯一值的一种相对简单的方法是,因为初始数组是固定的,所以删除对象而不是选择它们。在这种情况下,删除两个,你有一个四个数组,保证唯一性。这是基本代码:

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

答案 1 :(得分:1)

 //0 r
    //1 g
    //2 b
    //3 y
    //4 p
    //5 o
    NSArray * allColors = [[NSArray alloc] initWithObjects:@"r", @"g", @"b", @"y", @"p", @"o", nil];

    //Computer choose 4 random colors:

    NSUInteger x1 =1;
    NSUInteger x2 =1;
    NSUInteger x3 =1;
    NSUInteger x4 =1;

    while(x1 == x2 || x1 == x3 || x1 == x4 || x2 == x3 || x2 == x4 || x3 == x4)
    {
        x1 = arc4random() % 6;
        x2 = arc4random() % 6;
        x3 = arc4random() % 6;
        x4 = arc4random() % 6;
    }
    NSArray * computersSelection = [[NSArray alloc] initWithObjects: [allColors objectAtIndex: x1], [allColors objectAtIndex: x2], [allColors objectAtIndex: x3], [allColors objectAtIndex: x4], nil];

    NSLog(@"%@, %@, %@, %@", [computersSelection objectAtIndex:0], [computersSelection objectAtIndex:1], [computersSelection objectAtIndex:2], [computersSelection objectAtIndex:3]);

所以这是我的尝试。但我仍然更喜欢@jshier的回应。

答案 2 :(得分:0)

保留原始来源列表:

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