2012-03-08 83 views
2

我有一个方法称为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]; 

回答

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个随机不重复的汽车

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]; 
+0

我得到无限循环 – foho 2012-03-08 09:17:19

+0

嗯..它的奇怪,让我尝试另一种解决方案,我会回来在5分钟:) – 2012-03-08 09:19:04

+0

它花了我一阵子,但解决了! (检查我的编辑) – 2012-03-08 09:28:19

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

当然,一定要免费的,当你完成内存。