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