[JAVA] Ein kurzer Blick auf das Monty Hall-Problem

Einführung

Was ist das Monty Hall-Problem? Laut [Wikipedia](https://ja.wikipedia.org/wiki/Monty Hall-Problem)

Vor dem Spieler befinden sich drei geschlossene Türen, hinter einer Tür ein neues Preisauto und hinter den beiden Türen eine Ziege, was bedeutet, dass sie ausgeschaltet ist. Spieler können ein neues Auto bekommen, indem sie gegen die Tür des neuen Autos schlagen. Nachdem der Spieler eine Tür ausgewählt hat, öffnet der Moderator Monty die verbleibende Tür mit der Ziege und zeigt die Ziege. Dem Spieler wird nun gesagt, dass er die erste Tür, die er wählt, in die verbleibende ungeöffnete Tür ändern darf. Sollte der Spieler hier die Tür wechseln?

Es scheint, dass es ein Problem ist. (* Monty weiß jedoch, wohin er gehen muss und öffnet immer den Ort, an dem sich die Ziege befindet.) Auf den ersten Blick scheint sich die Wahrscheinlichkeit nicht zu ändern, selbst wenn die Tür geändert wird oder nicht, aber tatsächlich scheint es für den Spieler vorteilhaft zu sein, sie zu ändern **. Dieses Mal möchte ich dieses Experiment viel ausprobieren und die Ergebnisse vergleichen. Die Sprache ist immer sicher Java ~~ (so viel du willst) ~~.

Bedarf

Code

Monty.java


import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.HashSet;
import java.util.List;
import java.util.Random;

public class Monty {
    public static final int NUMBER_DOORS = 4;
    public static final int TRY_TIMES = 10000;
    public static final boolean CHANGE_DOOR = true; 

    //Holen Sie sich zufällig andere Türen als die angegebene Tür
    public static int getOtherDoor(Collection<Integer> doorIndices) {
        List<Integer> notSelectedDoors = new ArrayList<>();
        
        for (int i = 0; i < NUMBER_DOORS; i++) {
            if(!doorIndices.contains(i)){
                notSelectedDoors.add(i);
            }
        }
        Collections.shuffle(notSelectedDoors);
        return notSelectedDoors.get(0);
    }

    //Monty Hall-Prozess
    public static boolean montyHoll(){
        //Wie oft Monty die Tür öffnet
        final int OPEN_DORE_TIMES = NUMBER_DOORS - 2;
        
        Random r = new Random();
        int collectDoorIndex = r.nextInt(NUMBER_DOORS);
        int firstSelectDoorIndex = r.nextInt(NUMBER_DOORS);

        Set<Integer> notWillOpenDoorIndices = new HashSet<>();
        Set<Integer> openDoorIndices = new HashSet<>();

        notWillOpenDoorIndices.add(collectDoorIndex);
        notWillOpenDoorIndices.add(firstSelectDoorIndex);

        for (int i = 0; i < OPEN_DORE_TIMES; i++) {
            int otherDoor = getOtherDoor(notWillOpenDoorIndices);
            openDoorIndices.add(otherDoor);
            notWillOpenDoorIndices.add(otherDoor);
        }

        Set<Integer> notWillSelectDoorIndices = new HashSet<>(openDoorIndices);
        notWillSelectDoorIndices.add(firstSelectDoorIndex);

        int secondSelectDoorIndex = CHANGE_DOOR?getOtherDoor(notWillSelectDoorIndices):firstSelectDoorIndex;

        boolean getCar = (collectDoorIndex == secondSelectDoorIndex);
        /*System.out.printf("c:%d,fs:%d,ss:%d,g:%s\n", 
        collectDoorIndex, firstSelectDoorIndex, secondSelectDoorIndex, Boolean.toString(getCar));*/
        return getCar;
    }

    public static void main(String[] args) {
        int getCarTimes = 0;
        for (int i = 0; i < TRY_TIMES; i++) {
            if(montyHoll()){
                getCarTimes++;
            }
        }
        System.out.println((double)getCarTimes / (double)TRY_TIMES);
    }
}

Ergebnis

――Wir haben jeweils dreimal experimentiert. ――Wenn Sie jedoch die Tür wechseln und wenn Sie sie nicht ändern, werden wir dies separat tun. (Das heißt, die horizontale Richtung entspricht nicht.)

Tabelle 1: Drei Türen

No. Wenn Sie die Tür wechseln Wenn Sie die Tür nicht wechseln
1 0.6687 0.3401
2 0.6683 0.3409
3 0.6631 0.3351

Tabelle 2: 4 Türen

No. Wenn Sie die Tür wechseln Wenn Sie die Tür nicht wechseln
1 0.7561 0.2531
2 0.7486 0.2463
3 0.7534 0.2514

Tabelle 3: Fünf Türen

No. Wenn Sie die Tür wechseln Wenn Sie die Tür nicht wechseln
1 0.8006 0.2086
2 0.8038 0.2059
3 0.8011 0.1947

Zusammenfassung

―― Egal wie viele Türen Sie haben, ein Türwechsel scheint eine höhere Wahrscheinlichkeit zu haben. ―― Je mehr Türen Sie haben, desto vorteilhafter ist es, sie zu wechseln.

abschließend

Bis vor kurzem blieb dieses Problem nicht unbemerkt. Damit habe ich das Gefühl, dass ich es vorerst schlucken konnte. Immerhin ist es wichtig zu bestätigen.

Recommended Posts

Ein kurzer Blick auf das Monty Hall-Problem
Ein kurzer Rückblick auf Java in den letzten fünf Jahren
Werfen Sie einen kurzen Blick auf Gradle und lesen Sie das von Spring Initializr generierte build.gradle
Werfen wir einen Blick auf den Bildschirm von Quant Analyzer!
Ein Memorandum über das FizzBuzz-Problem
Ich habe mir die Ressourcen der Azure Container-Instanz angesehen
Ein Blick auf Jenkins, OpenJDK 8 und Java 11
Nachdem ich das Montyhall-Problem mit Ruby überprüft hatte, war es eine Geschichte, die ich gut verstehen konnte und die ich nicht gut verstand
Werfen wir einen Blick auf die Funktionen der Keycloak-Verwaltungskonsole (Administrator Edition).
[Bei Coder] Lösen Sie das ABC183 D-Problem mit Ruby
[Bei Coder] Lösen Sie das ABC182 D-Problem mit Ruby
Werfen wir einen Blick auf die Funktionen der Keycloak-Verwaltungskonsole (User Edition), dem Benutzerkontodienst