iOS-如何在阵列中选择比其他对象更多的对象

iOS-如何在阵列中选择比其他对象更多的对象,ios,objective-c,arrays,nsmutablearray,probability-density,Ios,Objective C,Arrays,Nsmutablearray,Probability Density,我有一个包含各种字符串的数组。我想在索引3、7和9处选择一个对象,比所有其他对象都多。我如何才能实现这一点。(假设每次我抓取数组中的对象时,我希望索引3、7或9处的对象有80%的几率被选中) 这是我的阵列: NSMutableArray* animalImagesArray = [[NSMutableArray alloc] initWithObjects:@"bull.png",@"bunny.png",@"chicken.png",@"cow.png",@"crocodile.png",@

我有一个包含各种字符串的数组。我想在索引3、7和9处选择一个对象,比所有其他对象都多。我如何才能实现这一点。(假设每次我抓取数组中的对象时,我希望索引3、7或9处的对象有80%的几率被选中)

这是我的阵列:

 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];

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

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


(另外,由于数组中的每个对象都有后缀.png,您最好删除该后缀,然后使用
stringWithFormat
)将其连接起来。

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


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

我喜欢Lyndsey Scott的答案,所以我想我应该实现它,这样您仍然可以获得单词的原始索引

如果你有一个由10个项目组成的数组,并且你希望其中3个(平均组合)有80%的几率被选中,那么这意味着其他7个项目有20%的几率被选中

所以

我是这样想的

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];
我们知道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];
这样,您就可以在不必获取原始项的情况下获取索引


任何一种方法都可以。

我喜欢Lyndsey Scott的答案,所以我想我应该实现它,这样你仍然可以得到单词的原始索引

如果你有一个由10个项目组成的数组,并且你希望其中3个(平均组合)有80%的几率被选中,那么这意味着其他7个项目有20%的几率被选中

所以

我是这样想的

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];
我们知道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];
这样,您就可以在不必获取原始项的情况下获取索引


任何一种方法都可以。

向数组中添加更多这些特定对象。@LyndseyScott genius!他打算建议math@LyndseyScott这对我不起作用,因为我使用特定对象的索引来生成赢/输条件将更多这些特定对象添加到数组中。@LyndseyScott genius!他打算建议math@LyndseyScott这对我不起作用,因为我使用特定对象的索引来生成赢/输条件。在加权数组中,可以使用int而不是对象。所以加权数组看起来像:
[0,1,2,3,3,…,3,4,5,6,7,7,…,7,8,9,9,…,9,10,…]
。然后首先获取索引,如果在从原始数组获取对象之前需要执行一些条件代码,那么这可能会更有用。@SandyChapman是的,这是另一种方法。我要补充一点。是的,现在人们对反对票太过自由了。。。回答得好。我喜欢指数数组的想法。但我也建议让程序做所有的数学运算(而不是“我们知道7是20%,所以100%是35,35的80%是28”),这样你就可以很容易地改变输入。@LyndseyScott肯定是的。通过将权重存储在应用程序中,您可以动态计算这些权重,以便轻松更改权重。我会加上它的,谢谢。@Fogmeister谢谢你的帮助..谢谢你对其他人的输入。在你的加权数组中,你可以使用int而不是object。所以加权数组看起来像:
[0,1,2,3,3,…,3,4,5,6,7,7,…,7,8,9,9,…,9,10,…]
。然后首先获取索引,如果在从原始数组获取对象之前需要执行一些条件代码,那么这可能会更有用。@SandyChapman是的,这是另一种方法。我要补充一点。是的,现在人们对反对票太过自由了。。。回答得好。我喜欢指数数组的想法。但我也建议让程序做所有的数学运算(而不是“我们知道7是20%,所以100%是35,35的80%是28”),这样你就可以很容易地改变输入。@LyndseyScott肯定是的。通过将权重存储在应用程序中,您可以动态计算这些权重,以便轻松更改权重。我会加上这些,谢谢。@Fogmeister谢谢你的帮助..谢谢大家的意见