0

我有一个包含各种字符串的数组。我想选择索引 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];

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

4

2 回答 2

6

我喜欢 Lyndsey Scott 的回答,所以我想我会实施它,以便您仍然可以获得单词的原始索引。

如果您有一个包含 10 个项目的数组,并且您希望其中 3 个(平均组合)有 80% 的机会被选中,那么这意味着其他 7 个有 20% 的机会。

所以...

我是这样解决的...

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

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

您将需要另外 3 个中的 28 个(总共),因此其中两个中的 9 个和另一个中的 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];

存储单个权重或其他东西然后计算您需要在运行时放置的数字可能是一个想法。

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

[0, 1, 2, 3, 3, 3, ..., 4, 5, 6, 7, 7, 7..., 8, 9, 9, 9, 9, ..., 10]

这样您就可以获取索引而无需获取原始项目。

无论哪种方式都会奏效。

于 2014-12-09T16:12:06.380 回答
0

一个从 1 到 5 的初步随机变量怎么样?如果选择 [1,4] 中的数字,则从集合 {3,7,9} 中随机选择一个索引。否则从数组的其余部分中随机选择一个对象。

(此外,由于数组中的每个对象都有后缀 .png,您不妨将其删除,稍后使用 .png 将其连接起来stringWithFormat

于 2014-12-09T16:07:18.967 回答