我不确定NSSet的anyObject
是如何工作的。什么意思是“返回的对象是在方便的时候选择的”(来自NSSet class reference)?
此外,如何从NSSet中随机提取最佳对象?我在考虑在数组中获取allObjects
然后myArray[arc4random_uniform(x)]
,其中x是数组中对象的数量。
答案 0 :(得分:14)
返回的对象是在方便的时候选择的 - 选择不保证是随机的。
对于“随机性”,使用NSSet
将NSArray
转换为[theSet allObjects]
。
接下来,使用arc4random_uniform()
随机选择任何对象。
答案 1 :(得分:13)
通常,NSSet
实例是使用CFHash
支持创建的,因此它们几乎总是返回该哈希中的第一个对象,因为它是查找速度最快的对象。它说的原因
返回的对象是在方便的时候选择的 - 选择不保证是随机的。
是因为你并不总是知道它会有一个支持数组。如您所知,您拥有的NSSet
实例有NSDictionary
支持它,或其他类似的数据结构。
因此,总而言之,如果您需要NSSet
中的随机对象,请不要使用-anyObject
,而是使用allObjects:
然后随机播放该数组。
答案 2 :(得分:4)
文档说明anyObject
返回
集合中的一个对象,如果集合不包含任何对象,则为nil。 返回的对象是在集合的方便性 - 选择中选择的 不保证是随机的。
最有可能存在一些确定性算法。
根据建议,最可靠的做法是使用NSArray
方法NSSet
创建allObjects
,然后从{{1}中选择一个随机元素其中arc4random() % N
是N
的{{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个对象。