public BattingResult GetBattingResult(BattingStint batter, PitchingStint pitcher, bool isPitcherTired)
        {
            var random       = new Random();
            var randomResult = random.Next(0, 2);

            if (randomResult == 0)
            {
                return(GetBatterBattingResult(batter, random));
            }

            return(GetPitcherBattingResult(pitcher, random, isPitcherTired));
        }
        private BattingResult GetPitcherBattingResult(PitchingStint pitcher, Random random, bool isPitcherTired)
        {
            var randomResult = random.Next(0, 1001);

            if (pitcher == null)
            {
                pitcher = PitchingStintHelperFunctions.CreatePitchingStintForNonPitcher();
            }

            var fatigueWildPitches = 0;
            var fatigueWalks       = 0;
            var fatigueHitBatters  = 0;
            var fatigueHits        = 0;
            var fatigueHomeRuns    = 0;

            if (isPitcherTired)
            {
                fatigueWildPitches = pitcher.WildPitches / 3;
                fatigueWalks       = pitcher.Walks / 3;
                fatigueHitBatters  = pitcher.HitBatters / 3;
                fatigueHits        = pitcher.WildPitches / 3;
                fatigueHomeRuns    = pitcher.HomeRuns / 3;
            }

            var totalOutcomes = pitcher.BattersFaced + pitcher.WildPitches + pitcher.Balks + fatigueWalks +
                                fatigueHitBatters + fatigueHits + fatigueHomeRuns + fatigueWildPitches;

            var successThreshold = ((double)pitcher.Balks / totalOutcomes) * 1000;

            if (randomResult <= successThreshold)
            {
                return(BattingResult.Balk);
            }
            successThreshold += (((double)pitcher.WildPitches + fatigueWildPitches) / totalOutcomes) * 1000;
            if (randomResult <= successThreshold)
            {
                return(BattingResult.WildPitch);
            }
            successThreshold += ((((double)pitcher.Hits + fatigueHits) - (pitcher.HomeRuns + fatigueHomeRuns)) / totalOutcomes) * 1000;
            if (randomResult <= successThreshold)
            {
                randomResult = random.Next(0, 101);
                if (randomResult <= 1)
                {
                    return(BattingResult.Triple);
                }
                if (randomResult <= 25)
                {
                    return(BattingResult.Double);
                }
                return(BattingResult.Single);
            }
            successThreshold += (((double)pitcher.HitBatters + fatigueHitBatters) / totalOutcomes) * 1000;
            if (randomResult <= successThreshold)
            {
                return(BattingResult.HitByPitch);
            }
            successThreshold += (((double)pitcher.HomeRuns + fatigueHomeRuns) / totalOutcomes) * 1000;
            if (randomResult <= successThreshold)
            {
                return(BattingResult.HomeRun);
            }
            successThreshold += (((double)pitcher.Strikeouts) / totalOutcomes) * 1000;
            if (randomResult <= successThreshold)
            {
                return(BattingResult.Strikeout);
            }
            successThreshold += (((double)pitcher.Walks + fatigueWalks) / totalOutcomes) * 1000;
            if (randomResult <= successThreshold)
            {
                return(BattingResult.Walk);
            }
            return(GetFieldedByRandomPositionResult(random));
        }