获取随机不重复数组的值

时间:2012-03-08 08:52:29

标签: objective-c ios nsarray

我有一个名为getRandomCar的方法,它通过NSTimer执行4秒钟。这个方法有一个这样的数组

NSArray *cars = [NSArray arrayWithObjects:@"Mercedes", @"Opel", @"Ford", @"Mazda", nil];

这个想法是在调用getRandomCar方法时返回的值与上次返回的值不同,即

Mescedes Opel Mercedes Mazda Ford Opel etc..

Mercedes Mercedes Mazda Opel Opel etc...

我试过这个,但没有运气。

NSString *car = [[NSString alloc]initWithFormat:@"%@", 
                           [carsArray objectAtIndex:arc4random() % [carsArray count]]];

    if ([self.tmpCar isEqualToString:car]) 
    {
        car = [carsArray lastObject];
    }

    [self settmpCar:playerName];

3 个答案:

答案 0 :(得分:1)

使用此:

NSArray *carsArray = [NSArray arrayWithObjects:@"Mercedes", @"Opel", @"Ford", @"Mazda", nil];

NSMutableString *car = [[NSMutableString alloc] init];
NSMutableString *lastCar = [[NSMutableString alloc] init];
[lastCar setString:@"XXX"];

do {


    [car setString:[NSString stringWithFormat:@"%@", 
            [carsArray objectAtIndex:arc4random() % [carsArray count]]]];
}
while ([lastCar isEqualToString:car]);
[lastCar setString:car];

答案 1 :(得分:0)

我建议你记住最后一辆车的索引。当你生成一个随机数时,检查它是否等于前一个,如果是,则生成另一个数字。示例代码:

int test;
int lastValue;
for (int a = 0; a < 10; a++) {
    test = arc4random() % 10;
    if (test == lastValue) {
        while (test == lastValue) {
            test = arc4random();
            NSLog(@"in While loop");
        }
    } else {
        NSLog(@"%i", test);
    }
    lastValue = test;
}

希望有所帮助

修改

决定为您添加代码:

NSArray *cars = [NSArray arrayWithObjects:@"Mercedes", @"Opel", @"Ford", @"Mazda", nil];
int test;
int lastValue;
for (int a = 0; a < 20; a++) {
    test = arc4random() % [cars count];
    if (test == lastValue) {
        while (test == lastValue) {
            test = arc4random();
        }
    } else {
        NSString *car = [cars objectAtIndex:test];
        lastValue = test;
    }
}

将生产20辆随机不可重复的汽车

答案 2 :(得分:0)

您可以使用另一个阵列来保存之前已经拾取过的车辆。在以下示例中,一旦耗尽整个carsArray,方法GetCar将返回nil。请注意,这可能不是最有效的方法,但对于小尺寸的carsArray,它应该可以正常工作。

在班级:

NSMutableArray *prevCars = [[NSMutableArray alloc] init];

你的方法:

-(NSString*) GetCar {

    if([prevCars count] == [carsArray count])
        return nil;

    NSMutableString *car = [[NSMutableString alloc] init];

    do {
        [car setString:[NSString stringWithFormat:@"%@", 
            [carsArray objectAtIndex:arc4random() % [carsArray count]]]];
    }
    while ([InArray:prevCars value:car])

    [prevCars addObject:car];

    return car;
}

然后:

-(BOOL)InArray:(NSArray *)arr value:(NSString *)val {

    for (id Elem in arr) {
        if([val isEqualToString:(NSString*)val])
            return YES;
    }

    return NO;
}

当然,确保在完成后释放内存。