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