2011-04-30 29 views

回答

21
#include <stdlib.h> 

NSArray* names = ...; 
NSMutableArray* pickedNames = [NSMutableArray new]; 

int remaining = 4; 

if (names.count >= remaining) { 
    while (remaining > 0) { 
     id name = names[arc4random_uniform(names.count)]; 

     if (![pickedNames containsObject:name]) { 
      [pickedNames addObject:name]; 
      remaining--; 
     } 
    } 
} 
+0

不要忘記種子... – 2011-04-30 06:00:50

+3

是的,我剛剛用arc4random()替換了rand(),這是優越的,不需要播種。 – 2011-04-30 06:03:59

+0

謝謝,它工作正常。但是,我認爲,採摘名應該是NSMutableArray – 2011-04-30 06:05:54

2

我做了一個叫NSArray+RandomSelection類別..。就在這個類別導入到一個項目,然後只需用

NSArray *things = ... 
... 
NSArray *randomThings = [things randomSelectionWithCount:4]; 

這裏的實現:

NSArray+RandomSelection.h

@interface NSArray (RandomSelection) 
    - (NSArray *)randomSelectionWithCount:(NSUInteger)count; 
@end 

NSArray+RandomSelection.m

@implementation NSArray (RandomSelection) 

- (NSArray *)randomSelectionWithCount:(NSUInteger)count { 
    if ([self count] < count) { 
     return nil; 
    } else if ([self count] == count) { 
     return self; 
    } 

    NSMutableSet* selection = [[NSMutableSet alloc] init]; 

    while ([selection count] < count) { 
     id randomObject = [self objectAtIndex: arc4random() % [self count]]; 
     [selection addObject:randomObject]; 
    } 

    return [selection allObjects]; 
} 

@end 
+2

隨機選擇的處理大於數組不正確。我使用以下代替前5行:'if([self count] miho 2012-10-04 09:01:41

+0

如果數組中的'count'個數少於'count',那麼最終會進入無限循環 – Pieter 2013-09-26 12:33:43

2

如果你喜歡一個斯威夫特框架 t帽子也有一些更方便的功能,可隨時結賬HandySwift。您可以通過迦太基將其添加到您的項目然後使用它是這樣的:

import HandySwift  

let names = ["Harry", "Hermione", "Ron", "Albus", "Severus"] 
names.sample() // => "Hermione" 

還有一種選擇,在一次得到多個隨機元素:

names.sample(size: 3) // => ["Ron", "Albus", "Harry"] 

我希望這有助於!

+0

這並不回答這個問題,因爲您需要展示如何使用隨機數列表選擇大數組中的名稱以創建拾取的名稱數組。 – Droppy 2016-06-09 21:13:25

+1

看來我的回答是誤導。我已經更新它以使用名稱數組作爲示例而不是數組數組。工作原理相同,只是一種不同類型的Array。我希望現在很清楚。 – Dschee 2016-06-09 21:21:01