List <ChanceClass> getChances(CommCollection_KLXxY sc, CombinClass restComb, string[] AllArr, ExpectData ed)
        {
            List <ChanceClass> ret = new List <ChanceClass>();

            for (int i = 0; i < restComb.Count; i++)
            {
                ChanceClass_ForCombinXxY cc = new ChanceClass_ForCombinXxY();
                cc.AllNums               = 11;
                cc.SelectNums            = 5;
                cc.strAllTypeBaseOdds    = sc.strAllTypeOdds;
                cc.strCombinTypeBaseOdds = sc.strCombinTypeOdds;
                cc.strPermutTypeBaseOdds = sc.strPermutTypeOdds;

                string        a7   = restComb[i];
                string[]      Arr4 = CombinClass.getReconvertString(AllArr, a7.Split(','));
                List <string> al   = new List <string>();
                for (int j = 0; j < Arr4.Length - 1; j++)
                {
                    al.Add(string.Format("A2/{0},{1}", Arr4[j], Arr4[j + 1]));
                }
                //al.Add(string.Format("A2/{0}", string.Join(",",Arr4)));//支持2码多数
                cc.ChanceCode = string.Format("A7/{0}+{1}", a7, string.Join("+", al));


                cc.UnitCost   = 2;
                cc.ChipCount  = 4;
                cc.ChanceType = 2;
                cc.InputTimes = 1;
                //cc.AllowMaxHoldTimeCnt = this.AllowMaxHoldTimeCnt;
                cc.InputExpect = ed;
                cc.StragId     = this.GUID;
                //cc.MinWinRate = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                cc.IsTracer            = 0;
                cc.HoldTimeCnt         = 1;
                cc.Odds                = this.CommSetting.GetGlobalSetting().Odds;
                cc.ExpectCode          = ed.Expect;
                cc.CreateTime          = DateTime.Now;
                cc.UpdateTime          = DateTime.Now;
                cc.AllowMaxHoldTimeCnt = 1;
                cc.Closed              = false;
                ret.Add(cc);
            }
            return(ret);
        }
        public override List <ChanceClass> getChances(BaseCollection bsc, ExpectData ed)
        {
            CommCollection_KLXxY sc = bsc as CommCollection_KLXxY;

            mSc = sc;
            DataTypePoint      dtp        = UsingDpt;
            string             strLogType = string.Format("彩种:{0};类型:{1};目标:{2};Expect:{3}", dtp.ExDataConfig.interfaceKey, this.InputMaxTimes, this.InputMinTimes, ed.Expect);
            List <ChanceClass> ret        = new List <ChanceClass>();
            MissDataCalcClass  mic        = new MissDataCalcClass(bsc);

            string[] strPeriods = dtp.ExDataConfig.periods.Split(',');
            Dictionary <string, MissDataItem> commList = null;
            int maxPeriod = int.Parse(strPeriods[strPeriods.Length - 1]);

            if (bsc.orgData.Count < maxPeriod)
            {
                Log(strLogType, string.Format("最大周期{0}的所需不能小于记录条数{1}!", maxPeriod, bsc.orgData.Count));
                return(ret);
            }
            Dictionary <string, MissDataItem> Maxmissdata = mic.getMissData(bsc.orgData, dtp, ed.Expect, maxPeriod, InputMaxTimes.ToString(), InputMinTimes.ToString(), new object[0] {
            });
            Dictionary <string, int> maxMissVal           = new Dictionary <string, int>();

            if (Maxmissdata == null)
            {
                return(ret);
            }
            //Log(strLogType, string.Format("最大周期{0}的成员数量为{1}个!", strPeriods[strPeriods.Length - 1], Maxmissdata.Count));
            if (Maxmissdata.Count == 0)
            {
                return(ret);
            }
            maxMissVal = Maxmissdata.ToDictionary(a => a.Key, a => int.Parse(a.Value.max_miss));
            int allMax = maxMissVal.Values.Max();

            for (int i = 0; i < strPeriods.Length; i++)
            {
                int peroid    = int.Parse(strPeriods[i]);
                int avg_times = (int)(bsc as CommCollection_KLXxY).getProbTimes(dtp, peroid, InputMaxTimes.ToString(), InputMinTimes.ToString(), new object[0]);
                Dictionary <string, MissDataItem> missdata = mic.getMissData(bsc.orgData, dtp, ed.Expect, int.Parse(strPeriods[i]), InputMaxTimes.ToString(), InputMinTimes.ToString(), new object[0] {
                });
                if (missdata == null)
                {
                    return(ret);
                }
                int currPeriodMax     = missdata.Max(a => int.Parse(a.Value.max_miss));
                int currPeriodMissMax = missdata.Max(a => int.Parse(a.Value.miss));
                if (currPeriodMax * 3 < allMax * 1)
                {
                    Log(strLogType, string.Format("当期最大数量遗漏数量{0}小于最大周期遗漏数量{1}的2/3,整期跳过!", allMax, currPeriodMissMax));
                    return(ret);
                }
                missdata = missdata.Where(a =>
                {
                    int test        = 0;
                    Single stest    = 0F;
                    Single avg_miss = Single.TryParse(a.Value.avg_miss, out stest) ? stest : 0F;
                    //if (avg_miss == 0)
                    //    return false;
                    int times         = a.Value.times;
                    int miss          = int.TryParse(a.Value.miss.ToString(), out test) ? test : 0;
                    int miss1         = int.TryParse(a.Value.miss1?.ToString(), out test) ? test : 0;
                    int max_miss      = int.TryParse(a.Value.max_miss.ToString(), out test) ? test : 0;
                    Single investment = Single.TryParse(a.Value.investment.ToString(), out stest) ? stest : 0F;
                    Single supplement = Single.TryParse(a.Value.supplement.ToString(), out stest) ? stest : 0F;
                    if (maxMissVal.ContainsKey(a.Key) == false)
                    {
                        return(false);
                    }
                    if (peroid < allMax / 2) //小周期,达到了周期长度的返回,初步删选,如果最大值的1/3都没达到,所有的直接过滤掉
                    {
                        return(miss == peroid);
                    }
                    if (miss * 3 < currPeriodMissMax * 2)
                    {
                        return(false);
                    }
                    if (miss < allMax / 2)
                    {
                        return(false);
                    }
                    if (miss + miss1 > allMax)
                    {
                        return(true);
                    }
                    if (miss == currPeriodMax)
                    {
                        return(true);
                    }
                    if (miss == currPeriodMissMax)
                    {
                        if (miss > currPeriodMax * 2 / 3)
                        {
                            return(miss > allMax / 3);
                        }
                    }
                    if (miss * 3 < 2 * miss1 && miss1 != max_miss)
                    {
                        return(false);
                    }
                    if (i < 3)
                    {
                        if (3 * miss < 2 * max_miss)
                        {
                            return(false);
                        }
                        return(2 * times > avg_times);
                    }
                    else
                    {
                        return(miss > (2 * max_miss / 3) && investment > 0);
                    }
                }).ToDictionary(a => a.Key, a => a.Value);
                Dictionary <string, MissDataItem> list = missdata.OrderByDescending(a => a.Value.investment).ToDictionary(a => a.Key, a => a.Value);
                if (list.Count == 0)
                {
                    return(ret);
                }
                if (commList == null)
                {
                    commList = list;
                }
                else
                {
                    Dictionary <string, MissDataItem> test = list.Where(a => commList.ContainsKey(a.Key)).ToDictionary(a => a.Key, a => a.Value);
                    if (test.Count > 0)
                    {
                        commList = test;
                    }
                    else
                    {
                        if (i > 1)
                        {
                            //commList = test;
                            break;
                        }
                        else
                        {
                            commList = test;
                        }
                    }
                }
            }
            if (commList.Count == 0)
            {
                return(ret);
            }
            Log(strLogType, string.Join(";", commList.Select(a => string.Format("{0}=>最小周期遗漏信息[当前:{1};前1:{2};最大:{3};次数:{4}]", a.Key, a.Value.miss, a.Value.miss1, a.Value.max_miss, a.Value.times)).ToList()));
            foreach (string key in commList.Keys)
            {
                ChanceClass_ForCombinXxY cc = new ChanceClass_ForCombinXxY();
                cc.ChanceCode = string.Format("{0}{1}/{2}", InputMaxTimes > 30 ? "C" : (InputMaxTimes > 10) ? "P" : "A", InputMinTimes, key);
                Dictionary <int, int> ints = cc.CombinTypeChipsBaseOdds;
                cc.AllNums               = 11;
                cc.SelectNums            = 5;
                cc.strAllTypeBaseOdds    = sc.strAllTypeOdds;
                cc.strCombinTypeBaseOdds = sc.strCombinTypeOdds;
                cc.strPermutTypeBaseOdds = sc.strPermutTypeOdds;
                //cc.UnitCost = 2;
                cc.ChipCount  = 1;
                cc.ChanceType = 2;
                cc.InputTimes = 1;
                //cc.AllowMaxHoldTimeCnt = this.AllowMaxHoldTimeCnt;
                cc.InputExpect = ed;
                cc.StragId     = this.GUID;
                //cc.MinWinRate = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                cc.IsTracer = 1;
                //cc.Tracerable
                cc.HoldTimeCnt         = 1;
                cc.Odds                = this.CommSetting.GetGlobalSetting().Odds;
                cc.ExpectCode          = ed.Expect;
                cc.CreateTime          = DateTime.Now;
                cc.UpdateTime          = DateTime.Now;
                cc.AllowMaxHoldTimeCnt = 1;
                cc.Closed              = false;
                ret.Add(cc);
            }
            return(ret);

            return(ret);
        }
        public List <ChanceClass> getChances1(BaseCollection bsc, ExpectData ed)
        {
            DataTypePoint                 dtp = UsingDpt;
            List <ChanceClass>            ret = new List <ChanceClass>();
            Web52CP_MissData_ProcessClass prs = new Web52CP_MissData_ProcessClass();

            if (!prs.hasNewsMissData(dtp, ed.LExpectNo.ToString()))
            {
                return(ret);
            }
            //int[] periods = new int[] { 100,300,1000, 3000, 10000 };
            string[] strPeriods = dtp.ExDataConfig.periods.Split(',');
            DataSet  ds         = new DataSet();
            string   strLogType = string.Format("彩种:{0};类型:{1};目标:{2}", dtp.ExDataConfig.interfaceKey, this.InputMaxTimes, this.InputMinTimes);

            for (int i = 0; i < strPeriods.Length; i++)//获取多个周期的遗漏数据
            {
                DataTable dt = prs.getData(dtp, null, dtp.ExDataConfig.argsModel, dtp.ExDataConfig.interfaceKey, strPeriods[i], this.InputMaxTimes, this.InputMinTimes);
                if (dt == null)
                {
                    Log(strLogType, string.Format("无法获取到{0}期外部数据", strPeriods[i]));
                    return(ret);
                }
                dt.TableName = strPeriods[i];
                ds.Tables.Add(dt);
            }
            Dictionary <string, string> commList = null;

            for (int i = 0; i < Math.Max(3, ds.Tables.Count); i++)
            {
                DataTable dt = ds.Tables[i];

                DataRow[] drs = dt.Select().Where(a => {
                    int test        = 0;
                    Single stest    = 0F;
                    Single avg_miss = Single.TryParse(a["avg_miss"].ToString(), out stest) ? stest : 0F;
                    if (avg_miss == 0)
                    {
                        return(false);
                    }
                    int miss          = int.TryParse(a["miss"].ToString(), out test) ? test : 0;
                    int miss1         = int.TryParse(a["miss1"].ToString(), out test) ? test : 0;
                    int max_miss      = int.TryParse(a["max_miss"].ToString(), out test) ? test : 0;
                    Single investment = Single.TryParse(a["investment"].ToString(), out stest)?stest:0F;
                    Single supplement = Single.TryParse(a["supplement"].ToString(), out stest) ? stest : 0F;
                    if (i < 3)
                    {
                        return(miss1 > 2 * avg_miss && miss > miss1 && miss == max_miss && investment > 0);
                    }
                    else
                    {
                        return(miss1 > 2 * avg_miss && miss > miss1 && miss > (2 * max_miss / 3) && investment > 0);
                    }
                }).ToArray();
                drs = drs.OrderByDescending(a => a["investment"].ToString()).ToArray();
                Dictionary <string, string> list = drs.Select(a => a["num"].ToString()).Take(20).ToDictionary(a => a, a => a);
                if (commList == null)
                {
                    commList = list;
                }
                else
                {
                    Dictionary <string, string> test = list.Where(a => commList.ContainsKey(a.Key)).ToDictionary(a => a.Key, a => a.Value);
                    if (test.Count > 0)
                    {
                        commList = test;
                    }
                    else
                    {
                        if (i > 2)
                        {
                            //commList = test;
                            break;
                        }
                        else
                        {
                            commList = test;
                        }
                    }
                }
            }
            Log(strLogType, string.Join(";", commList.Keys.ToList()));
            CommCollection_KLXxY sc = bsc as CommCollection_KLXxY;

            foreach (string key in commList.Keys)
            {
                ChanceClass_ForCombinXxY cc = new ChanceClass_ForCombinXxY();
                cc.ChanceCode            = string.Format("{0}{1}/{2}", InputMaxTimes > 30?"C":(InputMaxTimes > 10)?"P":"A", InputMinTimes, key);
                cc.AllNums               = 11;
                cc.SelectNums            = 5;
                cc.strAllTypeBaseOdds    = sc.strAllTypeOdds;
                cc.strCombinTypeBaseOdds = sc.strCombinTypeOdds;
                cc.strPermutTypeBaseOdds = sc.strPermutTypeOdds;
                cc.UnitCost              = 2;
                cc.ChipCount             = 1;
                cc.ChanceType            = 2;
                cc.InputTimes            = 1;
                //cc.AllowMaxHoldTimeCnt = this.AllowMaxHoldTimeCnt;
                cc.InputExpect = ed;
                cc.StragId     = this.GUID;
                //cc.MinWinRate = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                cc.IsTracer            = 0;
                cc.HoldTimeCnt         = 1;
                cc.Odds                = this.CommSetting.GetGlobalSetting().Odds;
                cc.ExpectCode          = ed.Expect;
                cc.CreateTime          = DateTime.Now;
                cc.UpdateTime          = DateTime.Now;
                cc.AllowMaxHoldTimeCnt = 1;
                cc.Closed              = false;
                ret.Add(cc);
            }
            return(ret);
        }
        public override List <ChanceClass> getChances(BaseCollection bsc, ExpectData ed)
        {
            List <ChanceClass> ret = new List <ChanceClass>();

            try
            {
                CommCollection_KLXxY sc = bsc as CommCollection_KLXxY;
                if (sc == null)
                {
                    throw new Exception("数据收集类!");
                }
                //this.ChipCount;//12选5和11选5都是5
                //this.InputMaxTimes; //12选5选为8,1选5选为7
                //this.InputMinTimes;//12选5和11选5都是4
                string[] AllArr = CombinClass.CreateNumArr(sc.AllNums);
                //CombinClass allcmb = CombinClass.CireateNumCombin(sc,iAllNums, 3);//获得所有的3组合
                CombinClass allbigcmb = CombinClass.CreateNumCombin(sc.AllNums, this.InputMaxTimes);//获得所有的8/7个组合
                Dictionary <string, MatchItem> allItems = new Dictionary <string, MatchItem>();
                allbigcmb.ForEach(a =>
                {
                    MatchItem mi = new MatchItem(AllArr, a, this.ChipCount, this.InputMinTimes);
                    mi.LongItem  = a;
                    mi.ShortItem = string.Join(",", mi);
                    allItems.Add(a, mi);
                });

                /*
                 * 列出所有11/7或者12/8码的组合,列出这些组合在回览期内的下列数据
                 * 1,全部命中次数
                 * 2,错过1个的次数
                 * 3,错过2个的次数n
                 * 3,错过3个次数
                 * 4,错过4个的次数)
                 */

                int lastid = sc.orgData.Count - 1;
                for (int i = 0; i < this.ReviewExpectCnt; i++)
                {
                    int index = lastid - i;
                    if (index < 0)
                    {
                        break;
                    }
                    string opencode = sc.orgData[index].OpenCode;
                    opencode = CombinGenerator.ResortNumString(opencode, ",");
                    foreach (MatchItem mi in allItems.Values)
                    {
                        for (int c = 0; c < this.InputMinTimes; c++)
                        {
                            int         MatchCnt = this.ChipCount - c;
                            CombinClass occ      = new CombinClass(opencode, MatchCnt);
                            int         mcnt     = 0;
                            foreach (string si in occ)//如果开奖号中5-c命中,停止,计数器加1
                            {
                                if (mi.SubItems[MatchCnt].Contains(si))
                                {
                                    mcnt++;
                                }
                            }
                            mi.SubItemMatchCnt[MatchCnt] += mcnt;
                            if (mcnt > 0)
                            {
                                break;
                            }
                        }
                    }
                }
                DataTable dt = new DataTable();
                dt.Columns.Add("Id");
                for (int i = 0; i < this.InputMinTimes; i++)
                {
                    dt.Columns.Add(string.Format("MCnt_{0}", this.ChipCount - i), typeof(int));
                }
                foreach (MatchItem mi in allItems.Values)
                {
                    DataRow dr = dt.NewRow();
                    dr["Id"] = mi.LongItem;
                    for (int i = 0; i < this.InputMinTimes; i++)
                    {
                        dr[string.Format("MCnt_{0}", this.ChipCount - i)] = mi.SubItemMatchCnt[this.ChipCount - i];
                    }
                    dt.Rows.Add(dr);
                }
                double    cnt4avg = allItems.Values.Select(a => a.SubItemMatchCnt[4]).Average();
                double    cnt3avg = allItems.Values.Select(a => a.SubItemMatchCnt[3]).Average();
                double    cnt2avg = allItems.Values.Select(a => a.SubItemMatchCnt[2]).Average();
                double    cnt5avg = allItems.Values.Select(a => a.SubItemMatchCnt[5]).Average();
                double    cnt4std = ProbMath.CalculateStdDev(allItems.Values.Select(a => a.SubItemMatchCnt[4]));
                double    cnt3std = ProbMath.CalculateStdDev(allItems.Values.Select(a => a.SubItemMatchCnt[3]));
                double    cnt2std = ProbMath.CalculateStdDev(allItems.Values.Select(a => a.SubItemMatchCnt[2]));
                double    cnt5std = ProbMath.CalculateStdDev(allItems.Values.Select(a => a.SubItemMatchCnt[5]));
                DataTable sdt     = dt.Clone();
                DataView  dv      = new DataView(dt);
                double    stdcnt  = 2;
                //
                string sql = string.Format("MCnt_5<={0} and MCnt_4>{1} and MCnt_3<={2} and MCnt_2<={3}", Math.Max(cnt5avg - stdcnt * cnt5std, 0), cnt4avg + stdcnt * cnt4std, Math.Max(0, cnt3avg - 0 * cnt3std), Math.Max(0, cnt2avg - 0 * cnt2std));

                //string sql = string.Format("MCnt_5<={0} and MCnt_4>{1} and MCnt_3<={2}", Math.Max(cnt5avg - stdcnt * cnt5std, 0), cnt4avg + stdcnt * cnt4std, Math.Max(0, cnt3avg - 0 * cnt3std));
                dt.Select(sql).ToList().ForEach(a => sdt.Rows.Add(a.ItemArray));
                dv = new DataView(sdt);

                //4个匹配要求最低。
                CombinClass cc = new CombinClass();
                for (int i = 0; i < Math.Min(dv.Count, 100); i++)
                {
                    cc.Add(dv[i].Row[0].ToString());
                }
                ret = getChances(sc, cc, AllArr, ed);
            }
            catch (Exception ce)
            {
                Log(ce.Message, ce.StackTrace);
            }
            return(ret);
        }