NSSet如何随机提取对象?

时间:2012-06-27 20:50:38

标签: iphone objective-c ios nsset

我不确定NSSet的anyObject是如何工作的。什么意思是“返回的对象是在方便的时候选择的”(来自NSSet class reference)?

此外,如何从NSSet中随机提取最佳对象?我在考虑在数组中获取allObjects然后myArray[arc4random_uniform(x)],其中x是数组中对象的数量。

4 个答案:

答案 0 :(得分:14)

引自NSSet Class Reference

  

返回的对象是在方便的时候选择的 - 选择不保证是随机的。

对于“随机性”,使用NSSetNSArray转换为[theSet allObjects]
接下来,使用arc4random_uniform()随机选择任何对象。

答案 1 :(得分:13)

通常,NSSet实例是使用CFHash支持创建的,因此它们几乎总是返回该哈希中的第一个对象,因为它是查找速度最快的对象。它说的原因

  

返回的对象是在方便的时候选择的 - 选择不保证是随机的。

是因为你并不总是知道它会有一个支持数组。如您所知,您拥有的NSSet实例有NSDictionary支持它,或其他类似的数据结构。

因此,总而言之,如果您需要NSSet中的随机对象,请不要使用-anyObject,而是使用allObjects:然后随机播放该数组。

答案 2 :(得分:4)

文档说明anyObject返回

  

集合中的一个对象,如果集合不包含任何对象,则为nil。   返回的对象是在集合的方便性 - 选择中选择的   不保证是随机的。

最有可能存在一些确定性算法。

根据建议,最可靠的做法是使用NSArray方法NSSet创建allObjects,然后从{{1}中选择一个随机元素其中arc4random() % NN的{​​{1}}。

答案 3 :(得分:1)

我使用arc4random()和两个可变数组来获取一组随机且唯一的对象:

NSMutableArray *selectionPool = ...;

int numberOfObjectsToSelect = x;

NSMutableArray *selectedObjects = [[NSMutableArray alloc] initWithCapacity:numberOfObjectsToSelect];

int modulus = selectionPool.count - 1;

for (int i = 0; i < numberOfObjectsToSelect; i++) {

    int j = arc4random() % (modulus--);
    [selectedObjects addObject:[selectionPool objectAtIndex:j]];
    [selectionPool removeObjectAtIndex:j];

}

我不确定它对于大型集合的效率如何,但它对我来说很有用,其中的集合数量低于100个对象。