Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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();
        }