2012-03-08 7 views
2

NSTimer経由で4秒間実行されるgetRandomCarというメソッドがあります。このメソッドは、この配列から反復しない値をランダムに取得する

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

アイデアが最後にすなわち

Mescedes Opel Mercedes Mazda Ford Opel etc.. 

私は持っていませ

Mercedes Mercedes Mazda Opel Opel etc... 

返さからgetRandomCar方法が異なるように戻り値を呼ばれたときであるような配列を持っていますこれを試したが運がなかった。

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

はそれが役に立てば幸い

編集

はあなたのためのコードを追加することにしました:20のランダムな非反復車

を行います
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; 
    } 
} 

1

これを使用:

+0

私は無限ループを取得します – foho

+0

hmmm ..その奇妙な、私は別の解決策を試してみましょう、悪い5分で戻ってください:) –

+0

それは私がしばらく時間がかかりました! (私の編集をチェックしてください) –

0

もう1つのアレイを使用して、以前にピックアップされた車を保持できます。次の例では、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; 
} 

、メモリを解放することを確認してください。

関連する問題