Gistrec icon

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

Gistrec | PRO | 11/17/20 06:18:29 PM UTC (Edited) | 0 ⭐ | 553 👁️ | Never ⏰ | []
C++ |

1.83 KB

|

None

|

0 👍

/

0 👎

#include <algorithm>
#include <iostream>
#include <random>
#include <numeric>
#include <array>
 
std::array<size_t, 3U> values = { 0U, 1U, 2U };
 
/**
 * Получаем случайное целое число в диапазоне от 0 до 2
 */
size_t random() {
    std::random_device random;
    std::default_random_engine engine(random());
    std::uniform_int_distribution<size_t> uniform_dist(0, 2);
    
    return uniform_dist(engine);
}
 
/**
 * Проводим эксперимент
 * @param change - нужно ли менять дверь после того, как ведущий открыл пустую дверь
 */
bool experiment(bool change) {
    size_t prizeDoor  = random(); // Дверь с призом
    size_t playerDoor = random(); // Игрок выбирает случайную дверь
 
    // Ведущий открывает пустую дверь, не выбранную игроком
    size_t showmanDoor = *std::find_if(values.begin(), values.end(), [=](size_t index) {
        return index != playerDoor && index != prizeDoor;
    });
 
    // Меняет ли игрок дверь или нет
    if (change) {
        playerDoor = *std::find_if(values.begin(), values.end(), [=](size_t index) {
            return index != playerDoor && index != showmanDoor;
        });
    }
 
    return playerDoor == prizeDoor;
}
 
int main() {
    /// Без изменения двери
    size_t wins = 0U;
    for (size_t i = 0U; i < 10000U; i++) {
        wins += experiment(false);
    }
    std::cout << "No   change: " << wins << std::endl;
    
    /// С изменением двери
    wins = 0U;
    for (size_t i = 0U; i < 10000U; i++) {
        wins += experiment(true);
    }
    std::cout << "With change: " << wins << std::endl;
 
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎