我有一个包含 N 个整数元素(N>4)的 NSMutableArray,我想从这个数组中获取 3 个不同的随机元素。我真的不需要完全均匀的分布,只需要 3 个不同的随机元素就可以了。你有什么建议吗?谢谢
4 回答
制作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]);
}];
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] 之间的值。
如果您不想更改原始数据数组,则只需复制该数组即可。
如果您想从代码中的不同位置多次执行此操作,请考虑执行此操作:“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
.
dasblinkenlight 的回答很好!
在斯威夫特 4中:
let indexes = NSMutableIndexSet()
if array.count > setSize {
repeat {
indexes.add(Int(arc4random_uniform(UInt32(array.count))))
} while (indexes.count < setSize)
}