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); }
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)); }