using System.Collections.Generic;
namespace DailyProgrammer_20210510
private static readonly Random _rand = new();
private static readonly double _runCount = 100000;
static void Main(string[] args)
List<Player> players = new()
new Player() { Name = "Alice", FirstChoice = Door.Choices.Door1, SecondChoice = Door.Choices.Door1, Wins = 0 },
new Player() { Name = "Bob", FirstChoice = Door.Choices.Door1, SecondChoice = Door.Choices.Other, Wins = 0 },
new Player() { Name = "Carol", FirstChoice = Door.Choices.Random, SecondChoice = Door.Choices.Random, Wins = 0},
new Player() { Name = "Dave", FirstChoice = Door.Choices.Random, SecondChoice = Door.Choices.Stick, Wins = 0},
new Player() { Name = "Erin", FirstChoice = Door.Choices.Random, SecondChoice = Door.Choices.Other, Wins = 0}
for (int j = 1; j <= _runCount; j++)
int winningDoor = _rand.Next(1, 3);
List<Door> doors = new();
for (int i = 1; i <= 3; i++)
doors.Add(new Door() { DoorNumber = (Door.Choices)i, IsWinner = i == winningDoor });
foreach (Player p in players)
if (DoorPicker(doors.ToList(), p.FirstChoice, p.SecondChoice))
foreach (Player p in players)
Console.WriteLine($"{p.Name}: {p.Wins} / 1000 = {Convert.ToDouble(p.Wins) / _runCount}");
private static bool DoorPicker(List<Door> doors, Door.Choices firstChoice, Door.Choices secondChoice)
case Door.Choices.Random:
firstChoice = (Door.Choices)_rand.Next(1, 3);
List<Door> doorsToRemove = doors.Where(d => !d.IsWinner && d.DoorNumber != firstChoice).ToList();
doors.Remove(doorsToRemove[_rand.Next(doorsToRemove.Count)]);
secondChoice = doors.First(d => d.DoorNumber != firstChoice).DoorNumber;
case Door.Choices.Random:
secondChoice = doors.OrderBy(d => Guid.NewGuid()).First().DoorNumber;
secondChoice = firstChoice;
return doors.Find(d => d.DoorNumber == secondChoice).IsWinner;
public Choices DoorNumber { get; set; }
public bool IsWinner { get; set; }
public override string ToString()
return $"Door: {DoorNumber} - IsWinner: {IsWinner}";
public string Name { get; set; }
public Door.Choices FirstChoice { get; set; }
public Door.Choices SecondChoice { get; set; }
public int Wins { get; set; }