-5

非常に初心者のobj-cの質問。

ViewController には 4 つの UIImage があります。彼らはトランプの真似をしています。ユーザーは開始時に自分の裏側しか見ることができません。ユーザーがそれらの 1 つをタップすると、前面が表示されます (これのアニメーションは現在準備ができています)。私の仕事は、定義された繰り返し率で 4 つの画像からランダムな前面を表示することです。したがって、ユーザーがこの ViewController にアクセスするたびに、画像の 1 つ (賞品) が他のいずれかを取得する可能性よりも 8 分の 1 少なく表示されるように設定したいと考えています。

可能であれば、ランダムに生成できるが繰り返し率を設定できるコードを教えてください

4

2 に答える 2

2
- (NSUInteger)indexForImageGivenIndexSet:(NSIndexSet*)indexSet             // Set of indexes you want to select from
                         prizeImageIndex:(NSUInteger)prizeIndex      // The prize index
                        probabilityScale:(CGFloat)probabilityScale   // The scale for the prize (8.0 for 8x less than the others)
{
    // If invalid, return what was given
    if (![indexSet containsIndex:prizeIndex]) {
        return prizeIndex;
    }

    // Calculate our probabilities
    // For a set of 4, with a scale of 8 on the prize, our probabilities would be
    // 0.04 (prize), 0.32, 0.32, 0.32
    double prizeProbability = (1.0 / indexSet.count) * (1.0 / probabilityScale);

    double val = (double)arc4random() / RAND_MAX;

    if (val < prizeProbability) {
        return prizeIndex;
    }
    else {
        // Select from the others in range equally
        NSMutableIndexSet* newSet = [[NSMutableIndexSet alloc] initWithIndexSet:indexSet];
        [newSet removeIndex:prizeIndex];

        NSInteger selectedPosition = arc4random() % newSet.count;
        __block NSInteger count = 0;
        return [newSet indexPassingTest:^BOOL(NSUInteger idx, BOOL *stop) {
            if (count == selectedPosition) {
                *stop = YES;
                return YES;
            }
            else {
                count++;
                return NO;
            }
        }];
    }
}
于 2012-12-10T17:11:03.280 に答える
1

WDUCの回答を間違って使用している可能性がありますが、彼の回答への回答で書いたように、その方法では正しい結果が得られません。概念的には、前述の思考実験と同じ方法があります。つまり、賞品の画像を1回配列し、他の3つの画像をそれぞれ8回配置すると、賞品の画像を選択します。他のどれよりも8分の1の頻度です。ただし、これを実装するには、仮想配列のカウント(この場合は25)に等しい数値のセットから乱数ジェネレーターを選択するだけで、モジュラス演算子を使用して正しいインデックスを取得できます。

4つの画像を含む配列があり、賞品の画像が最後である場合、このメソッドはその最後のインデックス(この場合は3)を他の3つの画像の8分の1の頻度で選択する必要があります(numOfItemsには4、probFactorには8を渡します)。あなたの例のために):

-(int)indexOfSelectionFromItems:(int) numOfItems timesLessPicked:(int) probFactor {
    int size = (numOfItems - 1) * probFactor + 1;
    int pick = arc4random_uniform(size);
    if (pick != size-1) {
        return (pick % (numOfItems - 1));
    }else{
        return numOfItems -1;
    }
}
于 2012-12-10T22:26:49.217 に答える