#include #include #include #include #include std::array values = { 0U, 1U, 2U }; /** * Получаем случайное целое число в диапазоне от 0 до 2 */ size_t random() { std::random_device random; std::default_random_engine engine(random()); std::uniform_int_distribution 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; }