14

我想从数组中获取随机对象,有什么办法可以从可变数组中找到随机对象?

4

7 回答 7

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

@implementation NSArray (Random)

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

@end
于 2011-09-28T08:34:15.117 回答
8
id obj;    
int r = arc4random() % [yourArray count];
    if(r<[yourArray count])
      obj=[yourArray objectAtIndex:r];
   else
   {
     //error message
   }
于 2011-09-28T08:31:50.037 回答
7
id randomObject = nil;
if ([array count] > 0){
    int randomIndex = arc4random()%[array count];
    randomObject = [array objectAtIndex:randomIndex];
}
于 2011-09-28T08:31:54.183 回答
3

最好的方法是做这样的事情

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

Object randomObj = [myMutableArray objectAtIndex:randomindex];
于 2011-09-28T08:32:26.303 回答
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;
}

注意:Count = 您要获取的随机值的数量

于 2015-04-02T17:34:42.747 回答
1

这是一个使用数组扩展的Swift 解决方案:

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您可以通过 Carthage将其添加到您的项目中,然后像上面的示例一样使用它:

import HandySwift    

let digits = Array(0...9)
digits.sample() // => 8
于 2016-06-09T17:50:28.457 回答
0

如果您不想扩展 NSArray,这将在一行中从给定数组中获取一个随机值:

id randomElement = [myArray objectAtIndex:(arc4random() % myArray.count)];
于 2015-01-07T11:18:43.570 回答