Advertisement
Gistrec

Парадокс Монти Холла

May 31st, 2020 (edited)
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <random>
  4. #include <numeric>
  5. #include <array>
  6.  
  7. std::array<size_t, 3U> values = { 0U, 1U, 2U };
  8.  
  9. /**
  10.  * Получаем случайное целое число в диапазоне от 0 до 2
  11.  */
  12. size_t random() {
  13.     std::random_device random;
  14.     std::default_random_engine engine(random());
  15.     std::uniform_int_distribution<size_t> uniform_dist(0, 2);
  16.    
  17.     return uniform_dist(engine);
  18. }
  19.  
  20. /**
  21.  * Проводим эксперимент
  22.  * @param change - нужно ли менять дверь после того, как ведущий открыл пустую дверь
  23.  */
  24. bool experiment(bool change) {
  25.     size_t prizeDoor  = random(); // Дверь с призом
  26.     size_t playerDoor = random(); // Игрок выбирает случайную дверь
  27.  
  28.     // Ведущий открывает пустую дверь, не выбранную игроком
  29.     size_t showmanDoor = *std::find_if(values.begin(), values.end(), [=](size_t index) {
  30.         return index != playerDoor && index != prizeDoor;
  31.     });
  32.  
  33.     // Меняет ли игрок дверь или нет
  34.     if (change) {
  35.         playerDoor = *std::find_if(values.begin(), values.end(), [=](size_t index) {
  36.             return index != playerDoor && index != showmanDoor;
  37.         });
  38.     }
  39.  
  40.     return playerDoor == prizeDoor;
  41. }
  42.  
  43. int main() {
  44.     /// Без изменения двери
  45.     size_t wins = 0U;
  46.     for (size_t i = 0U; i < 10000U; i++) {
  47.         wins += experiment(false);
  48.     }
  49.     std::cout << "No   change: " << wins << std::endl;
  50.    
  51.     /// С изменением двери
  52.     wins = 0U;
  53.     for (size_t i = 0U; i < 10000U; i++) {
  54.         wins += experiment(true);
  55.     }
  56.     std::cout << "With change: " << wins << std::endl;
  57.  
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement