0

さまざまな文字列を含む配列があります。インデックス 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];

どんな助けでも大歓迎です。前もって感謝します!

4

2 に答える 2

6

私はリンジー・スコットの答えが好きなので、単語の元のインデックスを引き続き取得できるように実装すると思いました。

10 個のアイテムの配列があり、そのうちの 3 つ (均等に結合) が 80% の確率で選択されるようにするには、残りの 7 つのアイテムが 20% の確率で選択されることを意味します。

そう...

私はそれをこのように仕上げました...

7 が 20% であることはわかっています。したがって、100% は 35 です。35 の 80% は 28 です。

理想的には、紙ではなくアプリでこの計算を行う必要があります:)各アイテムの個々の重量を配列などに保存するかもしれません。そうすれば、任意の数のアイテムや異なる重みなどに対して、重み付けされた配列を動的に作成できます...

残りの 3 個のうち 28 個 (合計) が必要なので、2 個のうち 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 に答える