Java >> Java tutorial >  >> Java

Monty Hall Java-program

Monty Hall Java-program | Manty Hall Problem er et spilshow, hvor publikum får valget mellem tre døre . Bag de to døre er der geder, og bag en anden dør er der en bil. Før showet starter, er disse geder og bilen placeret tilfældigt bag dørene.

Døren, der har en bil, er præmiedøren, og det er meningen, at du skal vælge den dør, der har en bil. Kun i det tilfælde vil du vinde spillet. Monty hall paradoks spil er et meget berømt undervisningsproblem i statistik.

Monty Hall Paradox-spilregler

1) Du bliver bedt om at vælge en dør. Inden tiden begynder, forbliver døren lukket.

2) Monty Hall, værten for spilshowet, ved, hvad der er bag døren. Nu skal han/hun åbne en af ​​de resterende døre. Når døren åbnes, skal den have en ged bagved.

3) Hvis der er en ged bag begge de resterende døre, vælger værten en dør tilfældigt.

4) Efter at have åbnet en dør med en ged, giver han dig igen den anden chance for at vælge døren igen. Du kan beslutte at blive ved den samme dør eller skifte til den sidste resterende dør.

For eksempel, hvis du har valgt dør-1, så skal værten (Monty Hall) åbne enten dør-2 eller dør-3, og den dør skal have en ged. Billedvært har åbnet dør-2. Nu skal du beslutte dig for, om du vil blive ved dit valg dør-1 eller vil skifte til dør-3. Hvis din valgte dør har en bil, så vinder du spillet, ellers taber du spillet.

Monty Hall Java-program

import java.util.Random;
import java.util.Scanner;

public class MontyHall {

   public static void main(String[] args) {
      Scanner scan = new Scanner(System.in);
      Random generator = new Random();
      int userDoor, openDoor, otherDoor;

      // generate random value 1 to 3
      int prizeDoor = generator.nextInt(3) + 1;
      int goatDoor1 = prizeDoor;
      while (goatDoor1 == prizeDoor) {
         goatDoor1 = generator.nextInt(3) + 1;
      }
      int goatDoor2 = goatDoor1;
      while (goatDoor2 == goatDoor1 || goatDoor2 == prizeDoor) {
         goatDoor2 = generator.nextInt(3) + 1;
      }

      // begin Game
      System.out.println("Welcome to the Monty Hall game show!");
      System.out.print("Select the door (1, 2, or 3): ");
      userDoor = scan.nextInt();

      // validation
      if (userDoor > 3 || userDoor <= 0) {
         System.out.print("Please select door 1, 2, or 3");
         userDoor = scan.nextInt();
      } else {
         if(userDoor == goatDoor1) {
            openDoor = goatDoor2;
            otherDoor = prizeDoor;
         } else if(userDoor == goatDoor2) {
            openDoor = goatDoor1;
            otherDoor = prizeDoor;
         } else {
            openDoor = goatDoor1;
            otherDoor = goatDoor2;
         }

         System.out.println("\nIn a moment, I will show you " 
                 + " where the prize is located, but first I will"
               + " show you what is behind one of the other doors");
         System.out.println("\nBehind door number " + openDoor 
                        + " are goats!");
         System.out.println("You selected door number " + userDoor);
         System.out.print("\nWould you like to switch your"+
                         " door (y/n)? ");

         // take user input Yes or No
         char userReply = scan.next().charAt(0);
         while (userReply != 'y' && userReply != 'n') {
            System.out.print("Please enter either y/n");
            userReply = scan.next().charAt(0);
         }
         if (userReply == 'y') {
            userDoor = otherDoor;
            System.out.println("Your choice switched to door " 
                               + userDoor);
         }

         System.out.println("The prize is behind door number: " 
                           + prizeDoor);

         // check if user won or lost
         if (userDoor == prizeDoor) {
            System.out.println("Congratulations! You won the prize!");
         } else {
            System.out.println("Sorry. You lost the game.");
         }
         scan.close();
      }
   }
}

Output:-

Velkommen til Monty Hall-spilleshowet!
Vælg døren (1, 2 eller 3):2

Om et øjeblik vil jeg vise dig, hvor præmien er placeret, men først vil vise dig, hvad der er bag en af ​​de andre døre

Bag dør nummer 1 er geder!
Du valgte dør nummer 2

Vil du skifte din dør (å/n)? n
Prisen er bag dørens nummer:2
Tillykke! Du vandt prisen!

Velkommen til Monty Hall-spilshowet!
Vælg døren (1, 2 eller 3):3

Om et øjeblik vil jeg vise dig, hvor præmien er placeret, men først vil vise dig, hvad der er bag en af ​​de andre døre

Bag dør nummer 1 er geder!
Du valgte dør nummer 3

Vil du skifte din dør (å/n)? y
Dit valg skiftede til dør 2
Præmien er bag dørnummer:3
Beklager. Du tabte spillet.

Så opgaven er at køre den tilfældige simulering af Monty Hall-spillet. Dette spil skal vise, hvordan strategien fungerer for at vinde, observer outputtet, chancen for at vinde, når du vælger at ændre døren, er meget højere, end når du ikke vælger at ændre. Lad os se Monty Hall Java-programmet.

Program, der simulerer Monty Hall-spil Java

import java.util.Random;

public class MontyHall {
   public static void main(String[] args) {

      Random random = new Random();
      int trial = 1000000;

      System.out.println("The player never changes the door.");
      int win = 0;
      for (int i = 1; i <= trial; i++) {
         int prizeDoor = random.nextInt(3);
         int contestantDoor = random.nextInt(3);

         if (contestantDoor == prizeDoor) {
            win++;
         }
      }

      System.out.println("Total Wins out of " + trial + ": " + win);
      System.out.println("Percent win: " + (double) win / trial);
      System.out.println();

      System.out.println("The player always changes the door.");
      win = 0;
      for (int i = 1; i <= trial; i++) {
         int prizeDoor = random.nextInt(3);
         int contestantDoor = random.nextInt(3);

         int wrongDoor = prizeDoor;
         while (wrongDoor == prizeDoor || 
                wrongDoor == contestantDoor) {
            wrongDoor = random.nextInt(3);
         }

         int alternateDoor = 3 - (contestantDoor + wrongDoor);

         if (alternateDoor == prizeDoor) {
            win++;
         }
      }

      System.out.println("Total Wins out of " + trial + ": " + win);
      System.out.println("Percent win: " + (double) win / trial);
   }
}

Output:-

Spilleren ændrer aldrig døren.
Totale gevinster ud af 1000000:333488
Gevinst i procent:0,333488

Spilleren skifter altid døren.
Totale gevinster ud af 1000000 :667534
Procent sejr:0,667534

Spilleren skifter aldrig døren.
Totale gevinster ud af 1000000:333105
Gevinst i procent:0,333105

Spilleren skifter altid døren.
Totale gevinster ud af 1000000 :666258
Procent sejr:0,666258

Spilleren skifter aldrig døren.
Totale gevinster ud af 1000000:333506
Gevinst i procent:0,333506

Spilleren skifter altid døren.
Totale gevinster ud af 1000000 :666795
Procent sejr:0,666795

I ovenstående Monty Hall Java-program har vi taget Java Random-klassen til at generere tilfældige tal. Og vi har taget de tilfælde, hvor spilleren aldrig skifter dør efter sit førstevalg, og tilfældet, hvor spilleren altid skifter dør.

Ud af 1000000 spil viser det chancen for at vinde procent. Gevinstprocenten, når spilleren skifter døren, er altid større end tilfældet, når spilleren ikke ændrer døren. Se også:- Anagram-program i Java ved hjælp af liste


Java tag