public static readonly bool Trace = true;
public static readonly int GamesCount = 100;
public static void Main(string[] args) {
var game = new MontyHallGame();
for (var i = 0; i < GamesCount; i++) {
double percent = (double)winsCount / GamesCount * 100;
string percentStr = percent.ToString("00.##");
Console.WriteLine($"Игр: {GamesCount}, побед: {winsCount}, {percentStr}%");
public class MontyHallGame {
var autoIndex = RandomHelper.GetRandomInt(0, 3);
Console2.Trace($"Индекс автомобиля: {autoIndex}");
var choiceIndex = RandomHelper.GetRandomInt(0, 3);
Console2.Trace($"Пользователь выбрал: {choiceIndex}");
var moderatorIndex = GetModeratorIndex(autoIndex, choiceIndex);
Console2.Trace($"Ведущий открыл: {moderatorIndex}");
for (var i = 0; i < 3; i++) {
if (i != choiceIndex && i != moderatorIndex) {
if (newChoiceIndex == -1) {
throw new InvalidOperationException($"{newChoiceIndex}");
Console2.Trace($"Новый выбор пользователя: {newChoiceIndex}");
if (newChoiceIndex == autoIndex) {
Console2.Trace($"Результат игры: {result}");
public int GetModeratorIndex(int autoIndex, int choiceIndex) {
if (autoIndex != choiceIndex) {
Console2.Trace("Простой алгоритм...");
for (var i = 0; i < 3; i++) {
if (i != autoIndex && i != choiceIndex) {
var msg = $"AutoIndex: {autoIndex}, ChoiceIndex: {choiceIndex}";
throw new InvalidOperationException(msg);
Console2.Trace("Алгоритм выбора из двух возможных вариантов...");
int freeIndex1 = -1, freeIndex2 = -1;
for (var i = 0; i < 3; i++) {
Console2.Trace($"Коза 1: {freeIndex1}, Коза 2: {freeIndex2}");
var k = RandomHelper.GetRandomInt(0, 2);
throw new InvalidOperationException($"k: {k}");
public static class RandomHelper {
public static int GetRandomInt(int inclusiveFrom, int exclusiveTo) {
return rnd.Next(inclusiveFrom, exclusiveTo);
public static class Console2 {
public static void Trace(string msg) {