iOS - 如何在阵列中选择对象更多 - 然后其他人

Mik*_*imz 0 arrays objective-c nsmutablearray ios probability-density

我有一个包含各种字符串的数组.我想在索引3,7和9中选择一个对象 - 所以其他所有对象..我可以实现这一点.(假设我每次在数组中抓取一个对象时,我希望有80%的几率选择索引为3,7或9的对象)

这是我的数组:

 NSMutableArray* animalImagesArray = [[NSMutableArray alloc] initWithObjects:@"bull.png",@"bunny.png",@"chicken.png",@"cow.png",@"crocodile.png",@"dog.png",@"donkey.png",@"duck.png",@"elephant.png",@"giraffe.png",@"goat.png",@"hippo.png",@"horse.png",@"lion.png",@"monkey.png",@"parrot.png",@"pig.png",@"rooster.png",@"sheep.png",@"snake.png",@"tiger.png",@"warthog.png",@"zebra.png", nil];
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.提前致谢!

Fog*_*ter 6

我喜欢Lyndsey Scott的回答,所以我认为我会实现它,这样你仍然可以得到单词的原始索引.

如果你有10个项目的数组,并且你想要其中3个(合并相同)有80%的机会被选中那么这意味着其他7个有20%的机会.

所以...

我这样做了......

我们知道7是20%.所以100%是35,35%的80%是28.

理想情况下,您应该在应用程序中进行此计算,而不是在纸上:)可能将每个项目的各个权重存储在数组或其他内容中.这样你就可以动态地为任意数量的项目和不同的权重等创建加权数组......

你需要其他3个中的28个(总共),其中两个中的9个和另外10个中的10个.(为了方便起见,我们分别为9).

所以你可以这样做......

NSMutableArray *weightedArray = [NSMutableArray array];

for (int i=0 ; i<originalArray.count ; ++i) {
    if (i == 3 || i == 7 || i == 9) {
        for (int count=0 ; count<9 ; ++count) {
            [weightedArray addObject:array[i]];
        }
    } else {
        [weightedArray addObject:array[i]];
    }
}

// Now you can select from the weighted array.

id randomObject = weightedArray[arc4random_uniform(weightedArray.count)];

//Index of object

NSUInteger origIndex = [originalArray indexOfObject:randomObject];
Run Code Online (Sandbox Code Playgroud)

存储单个权重或某事物然后计算运行时需要的数量可能是一个想法.

正如Sandy Chapman在评论中指出的那样你也可以为原始数组创建一个加权的索引数组,这样你就可以......

[0, 1, 2, 3, 3, 3, ..., 4, 5, 6, 7, 7, 7..., 8, 9, 9, 9, 9, ..., 10]
Run Code Online (Sandbox Code Playgroud)

这样你就可以获得索引而无需获得原始项目.

无论哪种方式都可行.

  • 在加权数组中,您可以使用int而不是对象.所以加权数组看起来像:`[0,1,2,3,3,...,3,4,5,6,7,7 ......,7,8,9,9 ...... ,9,10,......]`.然后你首先得到索引,如果你需要在从原始数组中获取对象之前做一些条件代码,这可能会更有用. (3认同)