Ziege ziehen

mettKopf

Neues Mitglied
Könnte mir jemand erklären, weshalb der Spieler häufiger die Ziege zieht, wenn er nach der Frage des Quizmasters nicht die Tür wechselt?

Java:
import java.util.Random;

public class Ziege {
    public static void main(String[] args) {
        int switchDoor = 0;
        int noSwitchDoor = 0;
        for (int i = 0; i < 100_000; i++) {
            switchDoor += simulate(true);
            noSwitchDoor += simulate(false);
        }
        System.out.printf("Switch door: %f%%%n", switchDoor / 1000.);
        System.out.printf("No switch door: %f%%%n", noSwitchDoor / 1000.);
    }

    private static int simulate(boolean switchDoor) {
        Random random = new Random();
        final int ziegeAt = random.nextInt(3);
        final int playerChoose1 = random.nextInt(3);
        if (ziegeAt == playerChoose1) {
            // The player has chosen the door with the goat behind it.
            return 0;
        }
        int playerChoose2;
        do {
            playerChoose2 = random.nextInt(3);
        } while (playerChoose2 == playerChoose1);
        // Ask the player to switch the chosen door:
        if (switchDoor) {
            playerChoose2 = playerChoose1 ^ playerChoose2 ^ 3;
        }
        if (playerChoose2 == ziegeAt) {
            // The player has chosen the door with the goat behind it.
            return 1;
        }
        // The player has chosen the door with the car behind it.
        return 2;
    }
}
 

Blender3D

Top Contributor
Könnte mir jemand erklären, weshalb der Spieler häufiger die Ziege zieht, wenn er nach der Frage des Quizmasters nicht die Tür wechselt?
Hier zuerst der überarbeitete Code der das Problem simuliert.
Java:
import java.util.Random;

public class GoatProblem {
    static final Random rnd = new Random(System.currentTimeMillis());
    static final int NUM_TRIES = 100_000;

    public static void main(String[] args) {

        int winSwitch = 0;
        int winNoSwitch = 0;
        // Make NUM_TRIES of games with door change and no door change
        for (int i = 0; i < NUM_TRIES; i++) {
            winSwitch += doGame(true);
            winNoSwitch += doGame(false);
        }
        System.out.printf("Switch door winnner:\t %d\n", winSwitch);
        System.out.printf("No switch door winnner:\t %d\n", winNoSwitch);
    }

    /**
     * @param switchDoor Player switch door or not.
     * @return 1 or 0 player wins or loose.
     */
    private static int doGame(boolean switchDoor) {
        final int carAt = getRndDoor();
        final int playerChoose = getRndDoor();
        if (!switchDoor)
            return carAt == playerChoose ? 1 : 0;
        int moderatorOpenDoor;
        do {
            moderatorOpenDoor = getRndDoor();
        } while (moderatorOpenDoor == carAt || moderatorOpenDoor == playerChoose);
        return carAt == playerChoose ? 0 : 1;
    }

    private static int getRndDoor() {
        return rnd.nextInt(3);
    }
}

@M.L hat dir die Theorie dazu bereits geschickt.
 

KonradN

Super-Moderator
Mitarbeiter

shokwave

Mitglied
@blender Nur der Vollständigkeit halber: Den Teil mit dem Türöffnen kann man auch weglassen.
Java:
private static int doGame(boolean switchDoor) {
    final int carAt = getRndDoor();
    final int playerChoose = getRndDoor();
    if (!switchDoor)
        return carAt == playerChoose ? 1 : 0;
    return carAt == playerChoose ? 0 : 1;
}
 

shokwave

Mitglied
Doch, doch. Das passt schon.
Der Moderator nimmt eine Tür mit einer Ziege aus dem Spiel, d.h. es gibt nur 2 Möglichkeiten. Entweder das Auto ist bei der Ursprünglichen Wahl oder hinter der verbleibenden Tür. Genau das prüft das 2. return. Ist das Auto hinter der ursprünglichen Wahl, verliert der Spieler (er hat ja gewechselt), ansonsten gewinnt er (es ist ja nur noch die Tür mit Auto übrig).

Man kann auch an deinem Code erkennen, dass der Teil unnötig ist. Du erstellst die Variable moderatorOpenDoor und befüllst sie korrekt, aber danach benutzt du sie nicht...
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
Doch, doch. Das passt schon.
Der Moderator nimmt eine Tür mit einer Ziege aus dem Spiel, d.h. es gibt nur 2 Möglichkeiten. Entweder das Auto ist bei der Ursprünglichen Wahl oder hinter der verbleibenden Tür.
Stimmt du hast recht. 👍
Man kann auch an deinem Code erkennen, dass der Teil unnötig ist. Du erstellst die Variable moderatorOpenDoor und befüllst sie korrekt, aber danach benutzt du sie nicht...
Ich benutze sie schon in der Bedingung aber dieser Teil ist wie du richtig bemerkt hast überflüssig.
 

shokwave

Mitglied
Ich benutze sie schon in der Bedingung
Ja, in der Bedingung der Schleife, welche zum Algorithmus zum ermitteln eines korrekten Wertes für moderatorOpenDoor gehört.
Ich meinte im weiteren Verlauf, was in dem Fall nur noch die Gewinnermittlung ist. Diese hätte auch so aussehen können:
Java:
return carAt == playerChoose || carAt == moderatorOpenDoor ? 0 : 1;
Dann würde das auf den ersten Blick alles valide und notwendig aussehen. Es ist ja auch nicht falsch.
Nur beim genauere hinsehen würde man feststellen, dass carAt == moderatorOpenDoor immer zu false evaluiert und damit für die Gewinnbedingung keine Rolle spielt. Der Moderator öffnet ja immer eine Tür mit einer Ziege, nicht mit dem Auto, was durch die Schleife sichergestellt wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Ziehen im Array um einen Schritt in eine einzige beliebige Richtung Java Basics - Anfänger-Themen 5
T Lottozahlen ziehen Java Basics - Anfänger-Themen 19
S GUI kann im WindowBuilder nicht mehr (größer kleiner ziehen) Java Basics - Anfänger-Themen 2
I Zeichen aus String ziehen Java Basics - Anfänger-Themen 3
L Applikativer Algorithmuss Wurzel ziehen Java Basics - Anfänger-Themen 10
K Methoden "ziehen ohne zurücklegen" - Kontrollstruktur Java Basics - Anfänger-Themen 4
A Werte per Zufall aus einer Datei ziehen und in eine neue Datei schreiben Java Basics - Anfänger-Themen 9
A Karten ziehen Java Basics - Anfänger-Themen 11
T Aus object Array Double Werte ziehen Java Basics - Anfänger-Themen 10
L Randomisierung einer Liste: Ziehen ohne Zurücklegen Java Basics - Anfänger-Themen 5
K JFrame größer ziehen Java Basics - Anfänger-Themen 5
N Datentypen Wurzel aus long ziehen Java Basics - Anfänger-Themen 4
J wurzel ziehen Java Basics - Anfänger-Themen 2
J aktuellen Timestamp ziehen Java Basics - Anfänger-Themen 3
H Rechteck ziehen bei einer Application Java Basics - Anfänger-Themen 2
M Werte quadrieren und Wurzel ziehen Java Basics - Anfänger-Themen 22
R Wurzel ziehen? Java Basics - Anfänger-Themen 24
G gezeichnetes nach Fenster ziehen weg? Java Basics - Anfänger-Themen 2
7 Wurzel ziehen geht nicht :-( Java Basics - Anfänger-Themen 23
P Wurzel ziehen Java Basics - Anfänger-Themen 17
T Wurzel aus einer Double-Zahl ziehen Java Basics - Anfänger-Themen 9
U programmfrage (wurzel ziehen) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben