2012-03-08 84 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; 
} 

當然,一定要免費的,當你完成內存。