2010-08-04 62 views
1

比方說,我有一個內部有50-100個對象的NSArray。我怎樣才能以隨機順序放置數組?如何隨機化NSArray?

+0

我提交問題的唯一原因是因爲我搜索範圍很廣,無法找到重複的線程。感謝您的鏈接!使用arc4random()的 – 2010-08-05 04:14:13

回答

14

有很多方法可以做到這一點,但大多數方法只涉及簡單地生成隨機數。也許你可以使用使用一個NSMutableArray此技術:

  1. 生成(假定50種元素)
  2. 交換元件0和任何數目你產生
  3. 生成1之間的隨機數0和49之間的隨機數49個
  4. 交換元素1和任何數量的你產生
  5. 等等

這將可能是最高效的方式。

示例代碼(未測試):

srandom(time(NULL)); 
for (NSInteger x = 0; x < [array count]; x++) { 
    NSInteger randInt = (random() % ([array count] - x)) + x; 
    [array exchangeObjectAtIndex:x withObjectAtIndex:randInt]; 
} 

此外,您可以通過,而第一個具有對象使用兩個NSMutableArray的對象,並簡單地循環,選擇一個隨機,並將其添加到其他結束一。儘管如此,就地方法可能會更快。

+3

好得多! – nonamelive 2010-08-04 07:50:50

+0

這是Fisher-Yates算法的一個版本。 http://en.wikipedia.org/wiki/Fisher-Yates_shuffle – JeremyP 2010-08-04 08:29:52

+0

isnt arc4random比較慢? – wahkiz 2011-03-09 04:11:41

-3
NSArray *test = [NSArray arrayWithObjects:@"AA",@"BC",@"DE",@"EG",@"FA",@"GQ",@"DA"];<br> 
NSSet *testset = [NSSet setWithArray:test]; 
NSArray *randomorder = [testset allObjects]; 
NSLog(@"random : %@",randomorder);<br><br> 

顯然NSSet沒有索引。因此,當轉換爲NSSet並返回時,NSArray對象可能會混亂。這是一個黑客解決方案,但它的工作原理(不確定這一點)。

+1

如果你把重複的對象放入一個集合會發生什麼? – 2011-04-04 21:24:19