2012-06-27 6 views
4

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

[putNumberUsed objectAtIndex:0] 

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

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

возможно дубликат - HTTP: // StackOverflow .com/вопросы/5659718/shuffling-a-array-in-objective-c –

+0

ible дубликат [Что лучший способ перетасовать NSMutableArray?] (http://stackoverflow.com/questions/56648/whats-the-best-way-to-shuffle-an-nsmutablearray) –

ответ

8

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

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

Это может быть полезно вам.

+0

То, что мне нужно. Приму. Благодаря! –

+5

Не очень хороший алгоритм. Используйте только один случайный индекс и объект обмена в этом индексе с объектом на 'i'. – onegray

+0

Да, вы правы onegray, мы можем использовать только одно случайное значение. – Rajesh

1

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

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

Что делать, если тот же индекс был генерируется несколько раз? 0_o –

2

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

[putNumbersUsed exchangeObjectAtIndex:3 withObjectAtIndex:0]; 

Я думаю, это может быть полезно для вас.

+2

Спасибо Раджеш Я искал что-то вроде этого, но разве это не только обменный объект на 3 с 0? Что делать, если я хотел бы сделать это случайно со всеми. Благодаря! –

+0

Да, вы правы. Но я думаю, что Раджеш хотел направить вас в правильном направлении. В моем ответе я написал очень похожий код, так что посмотри. –

0

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

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

вы должны пересчитать случайные данные на каждой итерации! – ragnarius

4

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

Это решение:

Срочное 3.2 и Свифта 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)))]) 
     } 
    } 
} 

Примечание: An algorithm for regular shuffling (where a result with same positions being possible) is also available

5

С прошивкой 10.х ++ новый concept of shuffle array дается Apple,

Вам необходимо импортировать базу:

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

#import <GameplayKit/GameplayKit.h> 

NSArray *shuffledArray = [yourArray shuffledArray]; 

Swift

import GameplayKit 

let shuffledArray = yourArray.shuffled()