2011-09-28 13 views
13

配列からランダムオブジェクトを取得したいのですが、どのようにして可変配列からランダムオブジェクトを見つけることができますか?配列からランダムオブジェクトを取得

+0

の可能重複[私の電話SDKの配列からランドン項目へのアクセス方法](のhttp:// stackoverflowのを.com/questions/3509411/i-phone-sdkでの配列からのアクセス方法 - –

答えて

33
@interface NSArray (Random) 
- (id) randomObject; 
@end 

@implementation NSArray (Random) 

- (id) randomObject 
{ 
    if ([self count] == 0) { 
     return nil; 
    } 
    return [self objectAtIndex: arc4random() % [self count]]; 
} 

@end 
+1

モジュロバイアスを避けるには、arc4random()ではなくarc4random_uniform()を使用します。 (詳細はhttp://stackoverflow.com/questions/10984974/why-do-people-say-there-is-modulo-bias-when-using-a-random-number-generatorを参照してください)。 –

8
id obj;  
int r = arc4random() % [yourArray count]; 
    if(r<[yourArray count]) 
     obj=[yourArray objectAtIndex:r]; 
    else 
    { 
    //error message 
    } 
+0

'else'についてはどうですか? – Thilo

+1

@ Thilo、そうでない場合は、メッセージなどが必要です。 – Ishu

7
id randomObject = nil; 
if ([array count] > 0){ 
    int randomIndex = arc4random()%[array count]; 
    randomObject = [array objectAtIndex:randomIndex]; 
} 
3

あなたがこの中に指定された配列からランダムな値を取得するにNSArrayを拡張したくない場合は、この

int length = [myMutableArray count]; 
// Get random value between 0 and 99 
int randomindex = arc4random() % length; 

Object randomObj = [myMutableArray objectAtIndex:randomindex]; 
0

ような何かをすることです最善の方法1行:

id randomElement = [myArray objectAtIndex:(arc4random() % myArray.count)]; 
1

そして

-(NSMutableArray*)getRandomValueFromArray:(NSMutableArray*)arrAllData randomDataCount:(NSInteger)count { 
NSMutableArray *arrFilterData = [[NSMutableArray alloc]init]; 
for(int i=0; i<count; i++){ 

    NSInteger index = arc4random() % (NSUInteger)(arrAllData.count); 
    [arrFilterData addObject:[arrAllData objectAtIndex:index]]; 
    [arrAllData removeObjectAtIndex:index]; 
} 
return arrFilterData; 
} 

注貼り付け:カウント=あなたは

1

を取得したいのランダムな値の数は、ここで配列上の拡張機能を使用してスウィフトソリューションです:

extension Array { 
    func sample() -> Element? { 
     if self.isEmpty { return nil } 
     let randomInt = Int(arc4random_uniform(UInt32(self.count))) 
     let randomIndex = self.startIndex.advancedBy(randomInt) 
     return self[randomIndex] 
    } 
} 

あなたはそれを使用することができますこのように簡単です

let digits = Array(0...9) 
digits.sample() // => 6 

あなたはまた、チェックアウトHandySwiftその後、いくつかのより多くの便利な機能を備えてい枠組みを好む場合。その後、正確に上記の例のように使用カルタゴを経由して、プロジェクトに追加することができます:

import HandySwift  

let digits = Array(0...9) 
digits.sample() // => 8 
関連する問題