Monty Hall Permet De Faire Une Affaire Java Simulation 10000 itérations


Im pour créer un programme qui exécute Monty Hall permet de faire un accord 10000 fois et affiche les statistiques suivantes:

  • le nombre de victoires par rapport aux pertes
  • le nombre de fois que le joueur a changé et gagné contre rester et gagnant.
  • affiche le pourcentage de victoires par rapport aux pertes lors du changement et du maintien.

La sortie souhaitée pour la commutation et gagner vs rester et gagner devrait être d'environ 2/3 lors de la commutation. Qui im obtenir, mais seulement la moitié; 33% lors du changement et 16% lors du séjour. Je ne sais pas pourquoi les 50% restants ne se présentent pas. À peu près sûr que cela a quelque chose à voir avec ma 2ème déclaration de commutateur mais ne peut pas le comprendre (probablement en raison du manque de sommeil).

Qu'est-ce que je fais de mal? merci à l'avance.

                int iterations; 
                for (iterations = 0; iterations < 10000; iterations++)
                {
                    int prizeIs = (int) ((Math.random() * 3) + 1);  
                    int compChoice = (int) ((Math.random() * 3) + 1);
                    int zonkIs = 0;
                    if ( prizeIs == compChoice )
                    {
                            boolean chooseFirstZonk = Math.random() < 0.5; // 50% chance
                            switch ( prizeIs ) 
                            {
                                case 1: if ( chooseFirstZonk ) 
                                        {
                                            zonkIs = 2;
                                        }    
                                        else 
                                        {
                                            zonkIs = 3;
                                        }
                                        break;
                                case 2: if ( chooseFirstZonk ) 
                                        {
                                            zonkIs = 1;
                                        }    
                                        else 
                                        {
                                            zonkIs = 3;
                                        }
                                        break;
                                case 3: if ( chooseFirstZonk ) 
                                        {
                                            zonkIs = 1;
                                        } 
                                        else 
                                        {
                                            zonkIs = 2;
                                        }
                                        break;
                                }
                        }
                        else if (prizeIs == 1 && compChoice == 2)
                        {
                            zonkIs = 3; 
                        }
                        else if (prizeIs == 1 && compChoice == 3 )
                        {
                            zonkIs = 2; 
                        }
                        else if (prizeIs == 2 && compChoice == 1 )
                        {
                            zonkIs = 3;
                        }
                        else if (prizeIs == 2 && compChoice == 3 )
                        {
                            zonkIs = 1;
                        }
                        else if (prizeIs == 3 && compChoice == 1 )
                        {
                            zonkIs = 2;
                        }
                        else if (prizeIs == 3 && compChoice == 2 )
                        {
                            zonkIs = 1;
                        }

                         //generating a 1 or 2 to decide whether to switch doors or not
                        int switchDoor = (int) (1 +  (Math.random() * 2));

                        switch ( switchDoor ) 
                        {
                            //not switching doors 
                            case 1:  
                                    {
                                        //since we didnt switch 
                                        //if compchoice == prize 
                                        //then thats considered a win 
                                        //for not switching 
                                        if (compChoice == prizeIs)
                                        {
                                            noSwitch++;
                                            wins++;
                                            games++;
                                        }
                                        //if we didnt win 
                                        //the games will be incremented by 1
                                        //later to use to calculate the losses 
                                        else
                                        {
                                            games++;
                                        }
                                    }    
                                    break;
                            //switch door
                            case 2:
                                    {
                                        //since we did switch 
                                        //if compchoice == prize 
                                        //then thats considered a loss 
                                        //because were switching 
                                        //to the door that has a zonk 
                                        if (compChoice == prizeIs)
                                        {
                                            games++;
                                        }

                                        //if compchoice != prize 
                                        //then thats considered a win 
                                        //because were switching from the door 
                                        //with a zonk to the door with the prize 
                                        else if(compChoice != prizeIs)
                                        {

                                            switches++;
                                            wins++;
                                            games++;
                                        }

                                    }
                        }
                if (iterations == 10000)
                {

                    double percentage = 100.0 * (switches/games);
                    double noswitchpercentage = 100.0 *(noSwitch/games);
                    System.out.println( "Switch percentage : " + percentage);
                    System.out.println( "No Switch percentage : " + noswitchpercentage);
                    System.out.println( "wins : "+ wins);
                    System.out.println("losses : " + (games - wins));
                    break;
                }
Author: user3185727, 2015-10-08

1 answers

Vous n'incrémentez switch/noswitch que lorsque le joueur gagne. Déplacez l'incrément switch/noswitch en dehors du if, et de préférence les jeux incrémentent en dehors de tout ce bloc switch afin qu'il ne soit pas dupliqué.

... ou peut-être que je n'ai pas tout à fait compris à quoi servent ces variables. parce que cela vous donnera 50% des jeux pour chacun.

Si vous voulez vraiment savoir gagner% pour chaque stratégie, vous aurez besoin de stocker le nombre de fois que vous utilisez chaque stratégie, et le nombre de victoires avec cette stratégie, qui est une chose de plus que ce que vous stockez actuellement. Ensuite, le calcul est wins_with_strategy / plays_with_strategy, plutôt que de diviser par le total des jeux.

 0
Author: moreON, 2015-10-08 08:20:26