private void Button_Start_Race_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (!this.HorseRaceConfiguration.IsRaceConfigured())
                {
                    return;
                }
                var winnerCreator = new RaceWinnerCreator(this.HorseRaceConfiguration);
                var winner        = winnerCreator.GetRaceWinner();
                if (winner == null)
                {
                    return;
                }

                string           caption = "WE HAVE A WINNER!!!!";
                MessageBoxButton button  = MessageBoxButton.OK;
                MessageBoxImage  icon    = MessageBoxImage.Information;
                MessageBox.Show(owner: this, messageBoxText: "THE WINNER IS :" + winner.RunnerName, caption: caption, button: button,
                                icon: icon, defaultResult: new MessageBoxResult(), options: MessageBoxOptions.RightAlign);
            }
            catch (Exception ex)
            {
                Logger.Log(message: ex.Message, stacktrace: ex.StackTrace);
            }
        }
        public void GetRaceWinner_WinningRate_IsValid()
        {
            int numberOfPlays = 1000000;
            var maxMargin     = 136.1;

            IRaceConfiguration RaceConfiguration = new HorseRaceConfiguration();
            var creator = new RaceWinnerCreator(RaceConfiguration);
            Dictionary <string, int> winsCounter = new Dictionary <string, int>();

            RaceConfiguration.AddRunner("A", "1/2");
            winsCounter.Add("A", 0);

            RaceConfiguration.AddRunner("B", "2/1");
            winsCounter.Add("B", 0);

            RaceConfiguration.AddRunner("C", "3/1");
            winsCounter.Add("C", 0);

            RaceConfiguration.AddRunner("D", "8/1");
            winsCounter.Add("D", 0);

            RaceConfiguration.GetMaxWinningMargin();

            for (int i = 0; i < numberOfPlays; i++)
            {
                var winner = creator.GetRaceWinner();
                winsCounter[winner.RunnerName] += 1;
            }

            foreach (var runner in RaceConfiguration.GetRunners())
            {
                var winRateForGivenRunner = ((100 / runner.FractionalValue) / maxMargin);

                var expectedWins = (int)(winRateForGivenRunner * numberOfPlays);

                var IsTheWinningRateValid = winsCounter[runner.RunnerName] < expectedWins + 0.02 * expectedWins &&
                                            winsCounter[runner.RunnerName] > expectedWins - 0.02 * expectedWins;

                Assert.IsTrue(IsTheWinningRateValid);
            }
        }