/// <summary>
        ///     解析因子在记录中的连续次数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dto"></param>
        /// <returns></returns>
        public static List <FactorTrendAnalyseResult <T> > AnalyseConsecutives <T>(MultiNumberFactorTrendAnalyseDto <T> dto)
        {
            var resultList = new List <FactorTrendAnalyseResult <T> >();

            foreach (var factor in dto.Factors)
            {
                var curDto = new MultiNumberAnalyseConsecutiveDto <T>
                {
                    Numbers             = dto.Numbers,
                    MultiNumberMaxCount = dto.MultiNumberMaxCount,
                    AllowMaxInterval    = dto.AllowMaxInterval,
                    AllowMinTimes       = dto.AllowMinTimes,
                    AllowMinFactorCurrentConsecutiveTimes = dto.AllowMinFactorCurrentConsecutiveTimes,
                    NumbersTailCutCount           = dto.NumbersTailCutCount,
                    AnalyseConsecutiveCompareFunc = dto.AnalyseConsecutiveCompareFunc
                };

                if (factor.Left != null && factor.Left.Count > 0)
                {
                    curDto.Factor           = factor.Left;
                    curDto.PredictiveFactor = factor.Right;
                    resultList.Add(AnalyseConsecutive(curDto));
                }
                if (factor.Right != null && factor.Right.Count > 0)
                {
                    curDto.Factor           = factor.Right;
                    curDto.PredictiveFactor = factor.Left;
                    resultList.Add(AnalyseConsecutive(curDto));
                }
            }
            return(resultList);
        }
        /// <summary>
        ///     分析
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public List <FactorTrendAnalyseResult <T> > Analyse <T>(MultiNumberFactorTrendAnalyseDto <T> dto)
        {
            /*
             * 位置索引:	0	1	2	3	4	5	6	7	8	9	10	11	12	13
             *  号码:	2	1	1	6	6	4	5	4	6	0	1	4	8	2
             * 分析的开始位置:  如:6,那么可以和0-5这5个位置的数字任意组合,加或减(暂不考虑乘除),比如:(0)2 + (6)5=7%10
             *
             *
             */
            if (dto.AnalyseConsecutiveCompareFunc == null)
            {
                throw new Exception("错误,统计连续次数的比较委托方法不能为空!");
            }

            if (dto.PredictiveConsecutivesCompareFunc == null)
            {
                throw new Exception("错误,分析可能连续次数的委托方法不能为空!");
            }

            if (dto.PredictiveFactorAction == null)
            {
                throw new Exception("错误,分析可能因子的委托方法不能为空!");
            }

            var factorResults = AnalyseConsecutives(dto);

            factorResults = factorResults.Where(t => t.HistoricalConsecutiveTimes.Count > 0).ToList();
            foreach (var item in factorResults)
            {
                var times = 0;

                //记录集合倒序检查,因子是否包含当前号码
                for (var i = dto.Numbers.Count - 1; i >= dto.MultiNumberMaxCount; i--)
                {
                    //if (!item.Factor.Contains(dto.Numbers[i]))
                    if (!dto.PredictiveConsecutivesCompareFunc(dto.Numbers, item.Factor, i))
                    {
                        break;
                    }
                    times++;
                }

                /* 暂时不重围可能的因子
                 * //重置可能的因子
                 * dto.PredictiveFactorAction(dto.Numbers, item.PredictiveFactor);
                 */
                //记录因子当前连续次数
                item.FactorCurrentConsecutiveTimes = times;
            }

            //1、按允许的最小因子当前连续次数和允许的最大间隔次数筛选
            //2、先按最大连续次数然后按最小间隔次数排序
            factorResults = factorResults
                            .Where(m => m.FactorCurrentConsecutiveTimes >= dto.AllowMinFactorCurrentConsecutiveTimes && m.Interval <= dto.AllowMaxInterval)
                            .OrderByDescending(t => t.FactorCurrentConsecutiveTimes)
                            .ThenBy(t => t.Interval).ToList();

            return(factorResults);
        }
Example #3
0
 public void TestAnalyseConsecutives()
 {
     var maxCount = 2;
     var dto      = new MultiNumberFactorTrendAnalyseDto <byte>
     {
         Numbers = new List <byte>()
         {
             1, 3, 9, 3, 8, 4, 7, 1, 9, 6, 4, 4, 6, 3, 2, 3, 6, 3, 3, 9, 2, 2, 4, 4, 0
         },
         Factors = new List <Factor <byte> >()
         {
             new Factor <byte>()
             {
                 Left = new List <byte>()
                 {
                     1, 2
                 }, Right = new List <byte>()
                 {
                     3, 4
                 }
             }
         },
         AllowMaxInterval = 0,
         AllowMinFactorCurrentConsecutiveTimes = 2,
         AllowMinTimes                 = 1,
         NumbersTailCutCount           = 6,
         AnalyseConsecutiveCompareFunc = (nums, factors, i) =>
         {
             var sum       = nums[i] + nums[i - 1];
             var curNumber = (byte)(sum % 10);
             return(factors.Contains(curNumber));
         },
         MultiNumberMaxCount = maxCount
     };
     var resultList = MultiNumberFactorTrend.AnalyseConsecutives(dto);
 }
Example #4
0
        public void TestAnalyse()
        {
            var maxCount = 2;
            var dto      = new MultiNumberFactorTrendAnalyseDto <byte>
            {
                Numbers = new List <byte>()
                {
                    1, 3, 9, 3, 8, 4, 7, 1, 9, 6, 4, 4, 6, 3, 2, 3, 6, 3, 3, 9, 6, 5, 7, 4, 8
                },
                Factors = new List <Factor <byte> >()
                {
                    new Factor <byte>()
                    {
                        Left = new List <byte>()
                        {
                            1, 2
                        }, Right = new List <byte>()
                        {
                            3, 4
                        }
                    }
                },
                AllowMaxInterval = 1,
                AllowMinFactorCurrentConsecutiveTimes = 2,
                AllowMinTimes                 = 1,
                NumbersTailCutCount           = 6,
                AnalyseConsecutiveCompareFunc = (nums, factors, i) =>
                {
                    var sum       = nums[i] + nums[i - 1];
                    var curNumber = (byte)(sum % 10);
                    return(factors.Contains(curNumber));
                },
                MultiNumberMaxCount = maxCount,
                PredictiveConsecutivesCompareFunc = (nums, factors, i) =>
                {
                    var sum       = nums[i] + nums[i - 1];
                    var curNumber = (byte)(sum % 10);
                    return(factors.Contains(curNumber));
                },
                PredictiveFactorAction = (nums, factor) =>
                {
                    //反向累加
                    var currentSum = 0;
                    var around     = 0;
                    var lastIndex  = nums.Count - 1;
                    for (var n = around; n >= 0; n--)
                    {
                        currentSum += nums[lastIndex - n];
                    }
                    //取10的模
                    var sum = (byte)(currentSum % 10);

                    //当前因子数-累加数取10的模(分析数字可能区域)
                    for (var n = 0; n < factor.Count; n++)
                    {
                        factor[n] = (byte)((factor[n] + 10 - sum) % 10);
                    }
                }
            };
            var resultList = new MultiNumberFactorTrend().Analyse(dto);
        }