public static async Task <ResultProbs> Generate(InputData inputData, int numMatches)
        {
            var generatedRes = await Task.Run(() =>
            {
                var meanIntensityHost  = inputData.MeanIntensityHost;
                var meanIntensityGuest = inputData.MeanIntensityGuest;
                var rand           = new Random();
                int numHostsWin    = 0;
                int numGuestsWin   = 0;
                int numNotFinished = 0;
                int numDraws       = 0;
                int goalsRemain    = inputData.GoalsRemain;
                for (int i = 0; i < numMatches; i++)
                {
                    int numGoalsHost  = 0;
                    int numGoalsGuest = 0;
                    //Подсчитаем количество уже произошедших голов
                    for (int l = inputData.Interval.From; l <= inputData.Interval.To; l++)
                    {
                        if (l > inputData.Goals.Length)
                        {
                            break;
                        }

                        if (inputData.Goals[l - 1] is GoalType.Host)
                        {
                            numGoalsHost++;
                        }
                        else
                        {
                            numGoalsGuest++;
                        }
                    }

                    if (goalsRemain > 0)
                    {
                        int goalsCounter = goalsRemain;
                        for (int j = 0; j < inputData.MinutesTillEnd; j++)
                        {
                            var r1 = rand.NextDouble();
                            var r2 = rand.NextDouble();

                            if (r1 <= meanIntensityHost)
                            {
                                //Гол хозяев
                                numGoalsHost++;
                                goalsCounter--;
                            }

                            if (goalsCounter == 0)
                            {
                                break;
                            }

                            if (r2 <= meanIntensityGuest)
                            {
                                //Гол гостей
                                numGoalsGuest++;
                                goalsCounter--;
                            }

                            if (goalsCounter == 0)
                            {
                                break;
                            }
                        }
                    }

                    if (numGoalsHost + numGoalsGuest < inputData.Interval.Length)
                    {
                        numNotFinished++;
                    }
                    else
                    {
                        if (numGoalsHost > numGoalsGuest)
                        {
                            numHostsWin++;
                        }

                        if (numGoalsGuest > numGoalsHost)
                        {
                            numGuestsWin++;
                        }

                        if (numGoalsGuest == numGoalsHost)
                        {
                            numDraws++;
                        }
                    }
                }
                //Посчитаем частоты исходов
                var hostsWonFrac    = (double)numHostsWin / numMatches;
                var guestsWonFrac   = (double)numGuestsWin / numMatches;
                var drawFrac        = (double)numDraws / numMatches;
                var notFinishedFrac = (double)numNotFinished / numMatches;
                var res             = new ResultProbs(hostsWonFrac, guestsWonFrac, drawFrac, notFinishedFrac);
                return(res);
            });

            return(generatedRes);
        }