0

問題は、質問の文言が言うボウリングシステムです:

アプリケーションは、ノックダウンされたピンの数をランダムに選択し、7、8、9、および 10 番のチャンスが 2 倍になります。

私が実装した方法は次のようなものです

だから私はこのようなものを思いついた:

pins = [0,0,0,0,0,0,0,0,0,0] // (1 for pin knocked down / 0 for pin standing)

for(i=0; i<pins.length; i++)

    if(pins[i]==0): //pin isn't already down

        if(i<6) 
            if(random(0~100) < 50):
                pins[i] = 1 //knock down
        else
            if(random(0~100) < 66):
                pins[i] = 1 //knock down


ex: [0,1,0,1,0,0,1,1,1,1] // 6 pins knocked down.

したがって、ピン 0 ~ 6 に対しては 1/2 の確率を、ピン 7 ~ 9 に対しては 2/3 の確率を実行し、配列からすべての要素を合計して、多くのピンがドロップされたことを確認しました。

しかし、ストライクもゼロも得られないことに気付いたので、これは間違っているのではないかと思い始めました。

すべてのピンに同じチャンスがあるとしましょう。pinsDropped = random(0,10) を実行するだけで、最終的にストライク (10) 9% の確率と 0 個のピンのドロップが得られます。しかし、ドロップされる可能性が 2 倍になるピンが 4 つあります。

私が間違っていることは何ですか?


アップデート:

はい、私は確率が苦手です。他の人と話した後、私は質問文を読むのも苦手だと指摘されました。私は問題を完全に誤解しました。と言うrandomly choose the number of pins knocked downdouble the chance to numbers 7,8,9,10

つまり、6ピンよりも10ピンを倒す可能性が高いということです。

7ピン、8ピン、9ピン、10ピン。ピン 7、ピン 8、ピン 9、ピン 10 ではありません。

私は自分の愚かさに完全にイライラしています。

だから私はこれを非常に複雑にしました。

function try(pins, prob) {
    if (prob > pins)
        prob = pins;
    aleat = mt_rand(0, pins+prob);
    if (aleat > pins)
        aleat -= prob;
    return aleat;
}
4

2 に答える 2

1

アプリケーションはノックダウンされたピンの数をランダムに選択し、ピン 7、8、9、および 10 に 2 倍のチャンスがあります。

問題の説明:

  • 全部で 10 個のピンがあります。

  • ピン 7、8、9、10 には 2 倍のチャンスがあります。

  • (6 * 1) + (4 * 2) = 6 + 8 = 合計 14 回のチャンスがあります。

  • A = { 1, 2, 3, 4, 5, 6 } ; a は A にある

  • B = {7、8、9、10}; b は B にある

  • P(a) = 1/14

  • P(b) = 2P(a) = 2/14 = 1/7

提案された解決策 (Java):

コード:

ArrayList<byte> pins = new ArrayList<byte>();
pins.addAll({1,2,3,4,5,6,7,8,9,10});

while (pins.size() > 0)
{
    /** pre-trial **/

    PinsExperiment.trial(pins);

    /** post-trial **/
}

クラス:

class PinsExperiment
{
    public static byte getChances(ArrayList<byte> pins)
    {
        byte c = 0;

        for (byte b : pins)
        {
            if (b <= 6) c += 1;
            else c += 2;
        }

        return c;
    }

    public static void trial(ArrayList<byte> pins)
    {
        byte chances = getChances(pins);

        byte r = Math.ceil(Math.random(0,chances));

        byte n = 0;

        for (byte b : pins) if (b <= 6) n++;

        if (r <= n) pins.remove(pins.get(r-1));
        else pins.remove(pins.get(((r-n)/2)-1)+n);
    }
}
于 2013-03-22T06:11:26.123 に答える
0

簡単な答え:

def randomChoose():
    x = randint(1,14);
    if x<=7:
        return x;
    else:
        return 6+ (x-5)/2;
于 2013-03-22T16:00:01.370 に答える