8

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

此外,我怎样才能最好地从 NSSet 中随机提取对象?我正在考虑进入allObjects一个数组,然后myArray[arc4random_uniform(x)]其中 x 是数组中的对象数。

4

4 回答 4

14

引用NSSet 类参考

返回的对象是在集合方便时选择的——不保证选择是随机的。

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

于 2012-06-27T20:56:35.120 回答
13

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

返回的对象是在集合方便时选择的——不保证选择是随机的。

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

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

于 2012-06-27T20:56:25.037 回答
4

文档显示anyObject返回

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

很可能有一些确定性算法在起作用。

正如您所建议的,最可靠的做法是NSArray使用该NSSet方法创建一个allObjects,然后从中选择一个随机元素,arc4random() % N其中的N是。countNSArray

于 2012-06-27T20:56:06.183 回答
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 多个对象中的集合。

于 2013-02-15T06:04:02.633 回答