1

私が読んだ確率によると、ドアを切り替えると、正しいドアを選択する可能性が最大 66% になるはずです。以下のこのコードは私が思いついたものであり、私が期待している 66% ではなく、約 50% の勝利を吐き出します。ここで私が間違っている場所についての助けをいただければ幸いです。

for (int count = 0; count < 10000; count++)
{
    // Chooses which door contains DAT GRAND PRIZE YO.
    wDoor = rand() % 3 + 1;

    // AI Contestants Door choice
    aiDoor = rand() % 3 + 1;

    // Using oldChoice to ensure same door isn't picked.
    oldChoice = aiDoor;
    // Used in determining what door to open.
    openedDoor = aiDoor;

    // "Open" a door that is not the winning door and not the door chosen by player.
    do
    {
                openedDoor = rand() % 3 + 1;

    }while (openedDoor != wDoor && openedDoor != aiDoor);

    // Select new door between the remaining two.
    do
    {
              aiDoor = rand() % 3 + 1;

    }while (aiDoor != oldChoice && aiDoor != openedDoor);

    // Increment win counter if new door is correct.
    if (aiDoor == wDoor)
    {
               chooseAgain++;
    }

}
4

3 に答える 3

4

あなたのwhile条件は間違っています:

while (openedDoor != wDoor && openedDoor != aiDoor)

する必要があります

while (openedDoor == wDoor || openedDoor == aiDoor)

于 2013-01-27T22:49:53.640 に答える
0

条件が逆転しました。do ... while (...) ループは、終了テストに対して反対の極性を持つ .. until(...) を繰り返す場合、コメントが説明するように実行されます。

必要なアルゴリズムを実装する条件を否定します。

どちらの場合も、選択できるドアは最大で 2 つあることに注意してください。その知識を使用すると、最大で 1 回の rand() の使用とループなしで次のドアを決定できます。

于 2013-01-27T22:59:05.233 に答える
0
// "Open" a door that is not the winning door and not the door chosen by player.
    do
    {
                openedDoor = rand() % 3 + 1;

    }while (openedDoor != wDoor && openedDoor != aiDoor);

勝者のドア (!) またはプレーヤーが選択したドアを開けた場合、この条件は false (つまり、ループが終了する) です。これはあなたが望むものの反対です。

    // Select new door between the remaining two.
    do
    {
              aiDoor = rand() % 3 + 1;

    }while (aiDoor != oldChoice && aiDoor != openedDoor);

プレーヤーが前と同じドアまたは開いたドアを選択した場合、この条件は false (つまり、ループが終了する) になります。これはまた、あなたが望むものとは反対です。

条件を逆にすると、期待される結果が得られます (~0.66)。

于 2013-01-27T23:22:41.137 に答える