2012-03-08 3 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

사용 :

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

+0

hmmm. 그 별난, 나에게 또 다른 해결을 시험하게해라, 악은 5 분 후에 돌아 간다 :) –

+0

그것은 나 그러나 잠겼다!! (내 편집을 확인하십시오) –

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

,이 완료 메모리를 해제해야합니다 .

관련 문제