6

我有一个包含 N 个整数元素(N>4)的 NSMutableArray,我想从这个数组中获取 3 个不同的随机元素。我真的不需要完全均匀的分布,只需要 3 个不同的随机元素就可以了。你有什么建议吗?谢谢

4

4 回答 4

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]);
}];
于 2012-09-09T00:52:02.693 回答
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] 之间的值。

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

于 2012-09-09T00:49:32.177 回答
2

如果您想从代码中的不同位置多次执行此操作,请考虑执行此操作:“Objective C 方式”是在 NSMutableArray 上创建一个类别,该类别添加一个 method 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.

于 2012-09-09T00:51:37.310 回答
0

dasblinkenlight 的回答很好!

斯威夫特 4中:

let indexes = NSMutableIndexSet()
if array.count > setSize {
    repeat {
        indexes.add(Int(arc4random_uniform(UInt32(array.count))))
    } while (indexes.count < setSize)
}
于 2017-10-18T17:02:35.110 回答