public List <T> Analyse1 <T>(FactorTrendAnalyseDto <T> dto) { //分析历史趋势,排除最后一位号码,(最后一位号码分析当前要分析的可能号码) var historicalNumbers = dto.Numbers.Take(dto.Numbers.Count - 1).ToList(); //分析每个因子 var factor = dto.Factor; //统计因子在记录中的趋势 var trendResult = CountConsecutiveDistribution(dto.Numbers, factor.Left, factor.Right); //行明细结果集 var rowDetailses = trendResult.FactorDistributions; if (rowDetailses == null || rowDetailses.Count == 0) { return(null); } var lastIndexResult = rowDetailses[rowDetailses.Count - 1]; //因子不包含最后一个号码,(连续次数为0) if (lastIndexResult.ConsecutiveTimes == 0) { return(null); } //大于等于指定的连续次和小于等于指定的间隔数 if (lastIndexResult.ConsecutiveTimes >= dto.AddConsecutiveTimes && lastIndexResult.MaxConsecutiveTimesInterval <= dto.AddInterval) { //返回的可能因子 return(factor.Right); } return(null); }
public List <Factor <T> > Analyse <T>(FactorsTrendAnalyseDto <T> dto) { //预测的可能因子 var predictiveFactors = new List <Factor <T> >(); var factorTrend = new FactorTrend(); //分析每个因子 foreach (var factor in dto.Factors) { var analyseDto = new FactorTrendAnalyseDto <T> { Factor = factor, Numbers = dto.Numbers, AllowMinTimes = dto.AllowMinTimes, AnalyseHistoricalTrendEndIndex = dto.AnalyseHistoricalTrendEndIndex, AddConsecutiveTimes = dto.AddConsecutiveTimes, AddInterval = dto.AddInterval }; var predictiveFactor = factorTrend.Analyse(analyseDto); if (predictiveFactor != null) { predictiveFactors.Add(factor); } } return(predictiveFactors); }
public List <T> Analyse <T>(FactorTrendAnalyseDto <T> dto) { //分析历史趋势,排除最后一位号码,(最后一位号码分析当前要分析的可能号码) var historicalNumbers = dto.Numbers.Take(dto.Numbers.Count - 1).ToList(); //分析每个因子 var factor = dto.Factor; //统计每个因子在记录中的趋势 var trendResult = CountConsecutiveDistribution(dto.Numbers, factor.Left, factor.Right); //行明细结果集 var rowDetailses = trendResult.FactorDistributions; if (rowDetailses == null || rowDetailses.Count == 0) { return(null); } var lastIndexResult = rowDetailses[rowDetailses.Count - 1]; //因子不包含最后一个号码,(连续次数为0) if (lastIndexResult.ConsecutiveTimes == 0) { return(null); } var historicalTrends = GetCorrectRates(historicalNumbers, trendResult, dto.AnalyseHistoricalTrendEndIndex, factor.Right); //筛选正确100%的历史趋势,如没有不记录 //historicalTrends = historicalTrends.Where(h => h.CorrectRate == 1).OrderBy(h => h.AllowInterval).ThenByDescending(h => h.AllowConsecutiveTimes).ToList(); historicalTrends = historicalTrends.Where(h => h.CorrectRate == 1).OrderByDescending(h => h.AllowConsecutiveTimes).ThenBy(h => h.AllowInterval).ToList(); if (historicalTrends.Count == 0) { return(null); } var firstHistoricalTrend = historicalTrends.FirstOrDefault(); if (firstHistoricalTrend == null) { return(null); } //可以考虑加大连续次数和间隔数 if (lastIndexResult.ConsecutiveTimes >= firstHistoricalTrend.AllowConsecutiveTimes + dto.AddConsecutiveTimes && lastIndexResult.MaxConsecutiveTimesInterval <= firstHistoricalTrend.AllowInterval - dto.AddInterval) { //返回的可能因子 return(factor.Right); } return(null); }
public void TestMethod_Analyse_Ten_Digit_By_Random_ASC() { var numbers = GetTestNumbers(0, 10, 100000); //因子 var factors = FactorGenerator.Create(new List <byte> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }.ToList()); var watch = new Stopwatch(); watch.Start(); var resultString = new StringBuilder(); var defaultTakeCount = 1000; var testCount = 2500; var trend = new FactorTrend(); var factorsTrendCorrectRates = new Dictionary <Factor <byte>, List <FactorTrendCorrectRate> >(); var firstrFactor = factors[0]; foreach (var factor in factors) { var strFactor = string.Join(",", factor.Right); var trendCorrectRates = new List <FactorTrendCorrectRate>(); for (var c = 3; c < 22; c++) { for (var interval = 0; interval > -9; interval--) { var hasCount = 0; var resultCount = 0; for (var i = testCount; i >= 0; i--) { var number = numbers[i]; var curNumbers = numbers.Skip(i + 1).Take(defaultTakeCount).ToList(); curNumbers.Reverse(); var dto = new FactorTrendAnalyseDto <byte> { AddConsecutiveTimes = c, AddInterval = interval, Numbers = curNumbers, AnalyseHistoricalTrendEndIndex = 1, Factor = factor }; var result = trend.Analyse1(dto); var success = false; if (result == null) { continue; } if (result.Count > 0) { resultCount++; if (result.Contains(number)) { success = true; } } if (success) { hasCount++; } } var correctRate = resultCount == 0 ? 0 : (double)hasCount / resultCount; if (correctRate == 1) { trendCorrectRates.Add(new FactorTrendCorrectRate { AllowConsecutiveTimes = c, AllowInterval = interval, AnalyticalCount = resultCount, CorrectCount = hasCount, TypeDescription = strFactor, CorrectRate = correctRate }); } } } if (trendCorrectRates.Count > 0) { factorsTrendCorrectRates.Add(factor, trendCorrectRates); } break; } watch.Stop(); var usedSeconds = watch.ElapsedMilliseconds / 1000; var realHasCount = 0; var realResultCount = 0; var consecutiveTimes = 12; var curInterval = -2; testCount = 99000; for (var i = testCount; i >= 0; i--) { var number = numbers[i]; var curNumbers = numbers.Skip(i + 1).Take(200).ToList(); curNumbers.Reverse(); var dto = new FactorTrendAnalyseDto <byte> { AddConsecutiveTimes = consecutiveTimes, AddInterval = curInterval, Numbers = curNumbers, AnalyseHistoricalTrendEndIndex = 1, Factor = firstrFactor }; var result = trend.Analyse1(dto); var success = false; if (result == null) { continue; } if (result.Count > 0) { realResultCount++; if (result.Contains(number)) { success = true; } } if (success) { realHasCount++; resultString.AppendLine("期次:" + i + ",号码:" + number + ",分析结果:" + (success ? "-Yes- " : " ") + string.Join(";", result)); } } watch.Stop(); usedSeconds = watch.ElapsedMilliseconds / 1000; var str = resultString.ToString(); }