Example #1
0
        public PrizeSelectionsForSuccessInfo GetResultsForPullsUntilSuccessSubset(IDictionary <int, int> successCriteria,
                                                                                  IList <SelectionDomain> selectionDomains, int subsetSize, Random random = null)
        {
            PrizeSelectionsForSuccessInfo successInfo = new PrizeSelectionsForSuccessInfo();
            int         trials = 100; //harcoded so user can't DOS
            IList <int> selectionsRequiredForTrialSuccess = new List <int>();

            for (int trial = 0; trial < trials; trial++)
            {
                IList <PrizeResultRow> trialCombinedPrizeResultsTable = new List <PrizeResultRow>(); //initialize; this will get overwritten in first trial

                if (random == null)
                {
                    random = new Random();
                }

                int counter = 1;
                do
                {
                    IList <PrizeResultRow> localPrizeResultsTable = _selectionEngine.SelectPrizes(selectionDomains, random);

                    if (counter == 1)
                    {
                        trialCombinedPrizeResultsTable = localPrizeResultsTable;
                    }
                    else
                    {
                        trialCombinedPrizeResultsTable =
                            _prizeResultsTableHelper.CombinePrizeResultTables(trialCombinedPrizeResultsTable, localPrizeResultsTable);
                    }

                    if (DoPrizeResultsMeetSuccessCriteriaSubset(trialCombinedPrizeResultsTable, successCriteria, subsetSize))
                    {
                        selectionsRequiredForTrialSuccess.Add(counter);
                        break;
                    }

                    counter++;
                } while (true);
            }
            ;

            //now that all the trials have recorded the number of pulls required to succeed, we can calculate the statistics
            successInfo.TrialsConducted          = trials;
            successInfo.MinSelectionsRequired    = selectionsRequiredForTrialSuccess.Min();
            successInfo.MaxSelectionsRequired    = selectionsRequiredForTrialSuccess.Max();
            successInfo.MeanSelectionsRequired   = selectionsRequiredForTrialSuccess.Average();
            successInfo.ModeSelectionsRequired   = GetModeFromList(selectionsRequiredForTrialSuccess);
            successInfo.MedianSelectionsRequired = GetMedianFromList(selectionsRequiredForTrialSuccess);

            return(successInfo);
        }
Example #2
0
        public IActionResult GetResultsForPullsUntilSuccess([FromBody] D.SuccessCalculationInput successCalculationInput)
        {
            D.PrizeSelectionsForSuccessInfo result = new D.PrizeSelectionsForSuccessInfo();

            if (successCalculationInput.SuccessCriteria != null && successCalculationInput.SuccessCriteria.Any() &&
                successCalculationInput.SelectionDomains != null && successCalculationInput.SelectionDomains.Any())
            {
                IList <SelectionDomain> selectionDomainModels = _mapper.Map <IList <SelectionDomain> >(successCalculationInput.SelectionDomains);

                PrizeSelectionsForSuccessInfo successModel = _selectionSuccessCalculator.GetResultsForPullsUntilSuccess(successCalculationInput.SuccessCriteria, selectionDomainModels);

                result = _mapper.Map <D.PrizeSelectionsForSuccessInfo>(successModel);
            }

            return(new ObjectResult(result));
        }