Перемешать NSMutableArray

У меня есть NSMutableArray, называемый putNumberUsed. Он содержит следующие объекты: "blah1, @" blah2 ", @" blah3 ", @" blah4 ". Я хочу случайным образом перетасовать эти объекты, например, если бы я выбрал:

 [putNumberUsed objectAtIndex:0] 

это дало бы мне что-нибудь, кроме "blah1". Как мне это сделать? Ниже приведен код, который я использовал до сих пор, заранее спасибо

NSMutableArray *putNumbersUsed= [[NSMutableArray alloc] arrayWithObjects:@"blah1",@"blah2",@"blah3",@"blah4",nil];

Ответ 1

Я думаю, вы можете написать цикл для этого. Пожалуйста, проверьте следующий код,

for (int i = 0; i < putNumberUsed.count; i++) {
    int randomInt1 = arc4random() % [putNumberUsed count];
    int randomInt2 = arc4random() % [putNumberUsed count];
    [putNumberUsed exchangeObjectAtIndex:randomInt1 withObjectAtIndex:randomInt2];
}

Мне это может быть полезно для вас.

Ответ 2

Из iOS 10.x ++ новая концепция массива shuffle предоставляется Apple,

Вам нужно импортировать фреймворк:

объективистские

#import <GameplayKit/GameplayKit.h>

NSArray *shuffledArray = [yourArray shuffledArray];

Swift

import GameplayKit

let shuffledArray = yourArray.shuffled()

Ответ 3

Вот решение перетасовки со всеми позициями, которые необходимо изменить, если count > 1.

Добавьте категорию, такую ​​как NSMutableArray + Shuffle.m:

@implementation NSMutableArray (Shuffle)
// Fisher-Yates shuffle variation with all positions forced to change
- (void)unstableShuffle
{
    for (NSInteger i = self.count - 1; i > 0; i--)
        // note: we use u_int32_t because `arc4random_uniform` doesn't support int64
        [self exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform((u_int32_t)i)];
}
@end

Затем вы можете перетасовать как:

[putNumbersUsed unstableShuffle];

Это решение:

A Swift 3.2 и Swift 4 эквивалент:

extension Array {
    mutating func unstableShuffle() {
        for i in stride(from: count - 1, to: 0, by: -1) {
            swapAt(i, Int(arc4random_uniform(UInt32(i))))
        }
    }
}

A Swift 3.0 и 3.1 эквивалент:

extension Array {
    mutating func unstableShuffle() {
        for i in stride(from: count - 1, to: 0, by: -1) {
            swap(&self[i], &self[Int(arc4random_uniform(UInt32(i)))])
        }
    }
}

Примечание: Также доступен алгоритм регулярной перетасовки (где возможен результат с одинаковыми позициями)

Ответ 4

Вы можете перетасовать объект, используя следующую строку кода,

[putNumbersUsed exchangeObjectAtIndex:3 withObjectAtIndex:0];

Я думаю, это может пригодиться вам.

Ответ 5

генерирует случайное число для индекса

int randomInt = arc4random() % [putNumberUsed count];
[putNumberUsed objectAtIndex:randomInt];

Ответ 6

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

for (int i = 0; i < [putNumberUsed count]; i++) {
    int random = arc4random() % [putNumberUsed count]; 
    [putNumbersUsed exchangeObjectAtIndex:random withObjectAtIndex:i]; 
}