Advertisement
SilentSpirit

Monty Holl Paradox

Apr 20th, 2019
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.22 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <chrono>
  4. #include <random>
  5. #include <string>
  6.  
  7. int g_changedWin;
  8. int g_changedLoose;
  9. int g_notChangedWin;
  10. int g_notChangedLoose;
  11.  
  12. int random(int num) // Рандомим число от 0 до num
  13. {
  14.     int seed1 = (int) (std::chrono::system_clock::now().time_since_epoch().count());
  15.  
  16.     std::minstd_rand0 random(seed1);
  17.     int randomResult = random() % num;
  18.     return randomResult;
  19. }
  20.  
  21. void printVector(const std::vector<std::string> &doors) // Вывод текущего вектора
  22. {
  23.     int doorNumber = 0;
  24.     for (size_t i = 0; i < doors.size(); i++) // Пробегаем по вектору
  25.     {
  26.         doorNumber = i + 1; // Корректируем отображение номера двери
  27.         std::cout << "#" << doorNumber << " door - " << doors[i] << std::endl; // Выводим номер ячейки вектора и её значение
  28.     }
  29.  
  30. }
  31.  
  32. void printMessage(std::vector<std::string> &doors, int doorIndex, std::string word) // Вывод сообщения определения\выбора\открытия двери с её номером
  33. {
  34.     if (doorIndex == 0)
  35.         std::cout << word << " First Door" << std::endl;
  36.     if (doorIndex == 1)
  37.         std::cout << word << " Second Door" << std::endl;
  38.     if (doorIndex == 2)
  39.         std::cout << word << " Third Door" << std::endl;
  40.     std::cout << "--------------------" << std::endl;
  41. }
  42.  
  43. int scanDoors(std::vector<std::string> &doors, std::string check) // Возвращение номера ячейки вектора со значением check (Проверяем наши двери)
  44. {
  45.     for (size_t i = 0; i < doors.size(); i++) // Пробегаем по вектору
  46.         if (doors[i] == check) // Пока не встретим значение равное check
  47.        
  48.     return i; // Возвращаем номер ячейки со значением check
  49. }
  50.  
  51.  
  52.  
  53. void selectDoor(std::vector<std::string> &doors)    // Выбор призовой двери
  54. {
  55.  
  56.     int selectedDoor = random(3);           // Генерируем случайное число от 0 до 2 для определения номеря с призовой дверью
  57.     doors[selectedDoor] = "Win";            // Присваиваем призовой двери победное значение
  58.  
  59.    
  60. }
  61.  
  62.  
  63. void chooseDoor(std::vector<std::string> &doors)    // Выбор двери игрока
  64. {
  65.  
  66.     int chosenDoor = random(3);         // Генерируем случайное число от 0 до 2 для определения номер выбраной двери
  67.     doors[chosenDoor] = "Chosen";       // Присваиваем призовой двери значение - Выбрана
  68. }
  69.  
  70.  
  71. void openDoor(std::vector<std::string> &doors) // Открытие пустой двери (Не игрока и не призовой)
  72. {
  73.  
  74.     int emptyDoor = scanDoors(doors, "Empty"); // Находим пустую дверь и возвращаем её номер
  75.     doors[emptyDoor] = "Opened"; // Присваиваем открытой двери значение - Открыта
  76.  
  77. }
  78.  
  79. void resulting(std::vector<std::string> &doors)
  80. {
  81.     int choise = random(2); // Генерируем 0 или 1 для определения выбора.
  82.     if (choise == 0) // Если 0, то дверь не меняем.
  83.     {
  84.  
  85.  
  86.         for (size_t i = 0; i < doors.size(); i++) // Проверяем двери
  87.             if (doors[i] == "Empty") // Если найдена пустая дверь, то игрок изначально выбрал победную дверь. Не изменил решение. Победа.
  88.             {
  89.                 g_notChangedWin++; // Ведем подсчет побед когда дверь не поменяли.
  90.  
  91.                 break;
  92.             }
  93.             else if (doors[i] == "Win") // Если найдена победная дверь, то игрок изначально выбрал пустую дверь. Не изменил решение. Проигрыш.
  94.             {
  95.                 g_notChangedLoose++; // Ведем подсчет поражений когда дверь не поменяли.
  96.  
  97.                 break;
  98.             }
  99.  
  100.     }
  101.     else // Если не 0 то дверь меняем
  102.     {
  103.  
  104.         for (size_t i = 0; i < doors.size(); i++) // Проверяем двери
  105.             if (doors[i] == "Empty") // Если найдена пустая дверь, то игрок изначально выбрал победную дверь. Изменил решение. Поражение.
  106.             {
  107.                 g_changedLoose++; // Ведем подсчет поражений когда дверь поменяли.
  108.  
  109.                 break;
  110.             }
  111.             else if (doors[i] == "Win") // Если найдена победная дверь, то игрок изначально выбрал пустую дверь. Изменил решение. Победа.
  112.             {
  113.                 g_changedWin++; // Ведем подсчет побед когда дверь поменяли.
  114.  
  115.                 break;
  116.             }
  117.     }
  118.  
  119. }
  120.  
  121.  
  122. void filling(std::vector<std::string> &doors)
  123. {
  124.     for (int i = 0; i < 3; ++i)
  125.         doors.push_back("Empty");
  126. }
  127.  
  128. int main()
  129. {
  130.     int attempts; // Заводим переменную попыток
  131.     std::cin >> attempts; // Запрашиваем количество попыток
  132.     std::vector<std::string> doors; // Создаем вектор с дверями
  133.     for (int x = 0; x < attempts; ++x)
  134.     {
  135.         filling(doors);
  136.  
  137.         selectDoor(doors); // Выбор победной двери
  138.  
  139.         chooseDoor(doors); // Выбор двери игрока
  140.  
  141.         openDoor(doors); // Открытие двери не игрока и не победной
  142.  
  143.         resulting(doors); // Расчет и подсчет результата
  144.  
  145.         doors.clear();
  146.     }
  147.    
  148.  
  149.     std::cout << "NotChangedWin = " << g_notChangedWin << std::endl << std::endl; // Вывод Количества побед когда дверь не была изменена.
  150.     std::cout << "ChangedWin = " << g_changedWin << std::endl << std::endl; // Вывод Количества побед когда дверь была изменена.
  151.     std::cout << "NotChangedLoose = " << g_notChangedLoose << std::endl << std::endl; // Вывод Количества побед.
  152.     std::cout << "ChangedLoose = " << g_changedLoose << std::endl << std::endl; // Вывод Количества поражений.
  153.  
  154.     system("pause");
  155.     return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement