Получить случайное не повторяющееся значение из массива - PullRequest
2 голосов
/ 08 марта 2012

У меня есть метод 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 ]

1 голос
/ 08 марта 2012

Используйте это:

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 голосов
/ 08 марта 2012

Вы можете использовать другой массив для хранения автомобилей, которые уже были подобраны ранее. В следующем примере, когда вы исчерпали весь 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;
}

Конечно, по окончании освободите память.

0 голосов
/ 08 марта 2012

Я бы порекомендовал вам вспомнить индекс последней машины. И когда вы генерируете случайное число, проверьте, равно ли оно предыдущему, и, если это так, сгенерируйте другое число. Пример кода:

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 случайных неповторяющихся машин

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...