fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define DOORS_NUM 3 // двери всего 3
  6.  
  7. #define EXPERIMENTS_NUM 20000 // кол.во экспериментов
  8.  
  9. int play_montyhall_game(int isChange_choise, int door_with_car){
  10. int player_choise = rand() % DOORS_NUM;
  11.  
  12. // проиграл, если сменил дверь выбрав изначально машину
  13. if(player_choise == door_with_car && isChange_choise)
  14. return 0;
  15.  
  16. // проиграл, если не сменил дверь выбрав изначально машину
  17. if(player_choise != door_with_car && !isChange_choise)
  18. return 0;
  19.  
  20. if(player_choise == door_with_car && !isChange_choise)
  21. return 1;
  22.  
  23. if(DOORS_NUM > 3){ // если бля вдруг дверей больше 3
  24. int player_choise_second = rand() % DOORS_NUM;
  25. while(player_choise_second == player_choise)
  26. player_choise_second = rand() % DOORS_NUM;
  27.  
  28. // если попал, то выиграл
  29. if(player_choise_second == door_with_car)
  30. return 1;
  31. else
  32. return 0;
  33. }
  34. else{
  35. // выиграл, если сменил дверь выбрав изначально козу (при условии, если двери всего 3)
  36. if(player_choise != door_with_car && isChange_choise)
  37. return 1;
  38. }
  39.  
  40. return -1; //error
  41. }
  42.  
  43. int main() {
  44. int change_door_counter = 0;
  45. int notchange_door_counter = 0;
  46.  
  47. int doors[DOORS_NUM] = {[0 ... DOORS_NUM - 1] = 0};
  48.  
  49. for(int i = 0; i < EXPERIMENTS_NUM; i++){
  50. int door_with_car_id = rand() % DOORS_NUM;
  51. doors[door_with_car_id] = 1;
  52. change_door_counter += play_montyhall_game(1, door_with_car_id);
  53. notchange_door_counter += play_montyhall_game(0, door_with_car_id);
  54.  
  55. memset(doors, 0, DOORS_NUM * sizeof(int));
  56. }
  57.  
  58. float change_door_win_chance = (float) change_door_counter / (float)EXPERIMENTS_NUM;
  59. float notchange_door_win_chance = (float) notchange_door_counter / (float)EXPERIMENTS_NUM;
  60.  
  61. printf("total games num: %d\nchange wins: %d, change winrate: %f\nnot change wins: %d, not change winrate: %f",
  62. EXPERIMENTS_NUM, change_door_counter, change_door_win_chance, notchange_door_counter, notchange_door_win_chance);
  63.  
  64. return 0;
  65. }
Success #stdin #stdout 0s 2168KB
stdin
Standard input is empty
stdout
total games num: 20000
change wins: 13291, change winrate: 0.664550
not change wins: 6628, not change winrate: 0.331400