Objective-C如何从NSArray中提取几个随机项而不会出现重复项?

Ale*_*one 1 random objective-c nsarray ios

我有一系列随机属性我想分配给我正在开发的游戏中的设备.

我在下面使用的代码是返回NSArray.我很感兴趣,如果有方法从该数组中获取项索引而不获取重复值.显而易见的解决方案是使用返回的数组创建一个可变数组,执行随机操作,删除返回的项目并循环直到收到项目数.

但是有没有不同的方法从NSArray获取X随机项而不会重复?

//get possible enchantments
NSPredicate *p = [NSPredicate predicateWithFormat:@"type = %i AND grade >= %i", kEnchantmentArmor,armor.grade];

NSArray* possibleEnchantments = [[EquipmentGenerator allEnchantmentDictionary] objectForKey:@"enchantments"];

//get only applicable enchantments
NSArray *validEnchantments = [possibleEnchantments filteredArrayUsingPredicate:p];
NSMutableArray* mutableArray = [NSMutableArray arrayWithArray:validEnchantments];

NSDictionary* enchantment = nil;

if(mutableArray.count>0)
{
    //got enchantments, assign number and intensity based on grade
    for (int i = 0; i<3;i++)
    {
        enchantment = mutableArray[arc4random()%mutableArray.count];
        [mutableArray removeObject:enchantment];

        //create enchantment from dictionary and assign to item.
    }

}
Run Code Online (Sandbox Code Playgroud)

god*_*el9 7

您可以使用以下技术之一来重新排列数组:

什么是洗牌NSMutableArray的最佳方式?
非重复随机数

然后,从数组中获取前X个元素.