2014-12-09 4 views
0

Цель: получить массив, чтобы перетасовать себя, когда NSUInteger * текущий итерации по окончательному индексу. Любая помощь была бы потрясающей.Repeat Array Shuffle

- (IBAction)buttonPressed:(id)sender { 
    [self buttonMechanics]; 
} 

- (void) generateArray { 
    NSUInteger count = [box count]; 
    for (NSUInteger i = 0; i < count; ++i) { 
    NSUInteger nElements = count - i; 
    NSUInteger n = (arc4random() % nElements) + i; 
    [box exchangeObjectAtIndex:i withObjectAtIndex:n]; 
    } 
} 



- (void) buttonMechanics { 
    if(current + 1 < [box count]) 
    { 
     current++; 
     post = [box objectAtIndex: current]; 
     [showItemLabel setText: post]; 
    } 
} 

@end 

ответ

0

Во-первых, вам понадобятся более описательные имена методов. buttonPressed - нехорошее имя; назовите его что-то связанное с действием, которое запускается нажатием кнопки, например shuffleArray. Другие также не являются описательными, особенно buttonMechanics.

Во-вторых, чтобы соответствующим образом перетасовать массив, используйте что-то вроде Fisher-Yates shuffle. Это очень легко реализовать.

В-третьих, если вы хотите перетасовать массив несколько раз (на самом деле это не стоит с правильно реализованным Fisher-Yates), просто выполните цикл for для вашей функции тасования.

Вот простая функция Objective-C перетасовать:

NSArray * shuffleCards(NSArray *cards) { 
    NSMutableArray *mutableCards = [cards mutableCopy]; 
    for (NSInteger i = mutableCards.count - 1; i >= 0; i--) { 
     NSUInteger randomIndex = arc4random_uniform((u_int32_t)i); 
     [mutableCards exchangeObjectAtIndex:i withObjectAtIndex:randomIndex]; 
    } 

    return [mutableCards copy]; 
} 

Если вы хотите, чтобы вызвать функцию несколько раз, просто цикл над ним, как это:

NSArray *cards = @[@1, @2, @3, @4]; 
for (NSUInteger i = 0; i < 5; i++) { 
    cards = shuffleCards(cards); 
} 
+0

Спасибо за вход. (Void) generateArray - это то, что я думал, уже алгоритм Shuffle Fisher-Yates. Он отлично функционирует для процесса рандомизации, но я не понимаю, как заставить массив повторно перетасовать себя, как только он будет повторен. – scott

+0

Вы просто назовете свой метод перетасовки (после того, как вы разложите свой тасовку в свой метод) несколько раз, возможно, в маленьком цикле, в зависимости от количества раз, которое вы хотите перетасовать. –

+0

Спасибо. Я просто борюсь с тем, где поставить цикл или несколько вызовов. Я пробовал различные подходы, но независимо от того, что я делаю, как только итератор попадает в последний индекс массива, он просто остается на месте. – scott