#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
0 B
|👍
/👎