iOS:从NSMutableArray中获取3个不同的随机元素

时间:2012-09-09 00:46:51

标签: ios random nsarray

我有一个N个整数元素的NSMutableArray(N> 4),我想从这个数组中得到3个不同的随机元素。我真的不需要一个完美均匀的分布,只有3个不同的随机元素应该没问题。你有什么建议吗?感谢

4 个答案:

答案 0 :(得分:10)

制作NSIndexSet,然后继续添加

int value = arc4random() % array.count;

项目,直到其大小达到3。你知道你有三个索引。

NSMutableIndexSet *picks = [NSMutableIndexSet indexSet];
do {
    [picks addIndex:arc4random() % array.count];
} while (picks.count != 3);
[picks enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
    NSLog(@"Element at index %ud: %@", idx, [array elementAt:idx]);
}];

答案 1 :(得分:6)

for (int i = 1; i <= 3; i++) {    
    int index = (int)(arc4random() % [array count]);
    id object = [array objectAtIndex:index];
    [array removeObjectAtIndex:index];
}

arc4random()返回[0,2 ^ 32-1]范围内的随机数。使用模数大小的模数得到的余数得到一个介于[0,arrayCountLessOne]之间的值。

如果您不想更改原始数据数组,只需复制数组即可。

答案 2 :(得分:2)

如果您想在代码中的不同位置多次执行此操作,请考虑执行此操作:“Objective C方式”是在NSMutableArray上创建一个类别,该类别添加方法randomObjects。方法本身应该生成从0到数组-1(N-1)长度的三个随机整数,然后根据这里的其他答案返回数组中的一组对象(特别是dasblinkenlight)。 )

首先,创建类别。创建一个新的头文件NSMutableArray+RandomObject.h,其中包含:

@interface NSMutableArray (RandomObjects)

- (NSSet *) randomObjects;

@end

括号中的RandomElement是您的类别的名称。您编写的任何包含此新标头文件的类都会为您的NSMutableArray个实例提供randomElement方法。

然后在NSMutableArray+RandomObjects.m中执行:

@implementation NSMutableArray (RandomObjects)

- (NSSet *) randomObjects {
  // Use the code from @dasblinkenlight's answer here, adding the following line:
  return picks;
}

@end

基本上就是这样。您已将该功能有效地添加到NSMutableArray

答案 3 :(得分:0)

来自dasblinkenlight的好答案!

Swift 4

let indexes = NSMutableIndexSet()
if array.count > setSize {
    repeat {
        indexes.add(Int(arc4random_uniform(UInt32(array.count))))
    } while (indexes.count < setSize)
}