我不确定 NSSet 是如何anyObject工作的。“返回的对象是在集合方便时选择的”(来自NSSet 类参考)是什么意思?
此外,我怎样才能最好地从 NSSet 中随机提取对象?我正在考虑进入allObjects一个数组,然后myArray[arc4random_uniform(x)]其中 x 是数组中的对象数。
我不确定 NSSet 是如何anyObject工作的。“返回的对象是在集合方便时选择的”(来自NSSet 类参考)是什么意思?
此外,我怎样才能最好地从 NSSet 中随机提取对象?我正在考虑进入allObjects一个数组,然后myArray[arc4random_uniform(x)]其中 x 是数组中的对象数。
引用NSSet 类参考:
返回的对象是在集合方便时选择的——不保证选择是随机的。
对于“随机性”,将 转换NSSet为NSArrayusing [theSet allObjects]。
接下来,使用 随机选择任何对象arc4random_uniform()。
通常,NSSet实例是通过CFHash支持创建的,因此它们几乎总是返回该哈希中的第一个对象,因为它是查找速度最快的。它说的原因
返回的对象是在集合方便时选择的——不保证选择是随机的。
是因为您并不总是知道它将有一个支持数组。就您所知,NSSet您拥有的实例有一个NSDictionary支持它,或一些其他类似的数据结构。
因此,总而言之,如果您需要 a 中的随机对象NSSet,请不要使用-anyObject,而是使用allObjects:然后打乱该数组。
文档显示anyObject返回
集合中的一个对象,如果集合不包含任何对象,则为 nil。返回的对象是在集合方便时选择的——不保证选择是随机的。
很可能有一些确定性算法在起作用。
正如您所建议的,最可靠的做法是NSArray使用该NSSet方法创建一个allObjects,然后从中选择一个随机元素,arc4random() % N其中的N是。countNSArray
我使用 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 多个对象中的集合。