Ejemplo n.º 1
0
        //如果存在超过2个以上的连续数字, 如: 10,1,2,3,4,5,6,7,8,9 中的1,2,3,4,5,6,7,8,9 , 则将1,2,3,4,5,6,7,8,9打乱
        private List <int> ReOrderRanks(List <int> ranks)
        {
            var ranksStr = string.Join(",", ranks);//10,1,2,3,4,5,6,7,8,9

            var max      = ranks.Count;
            var maxRanks = new List <int>();

            for (var i = 1; i <= max; i++)
            {
                maxRanks.Add(i);
            }
            var maxRanksStr = string.Join(",", ranks);   // 1,2,3,4,5,6,7,8,9,10

            for (var len = max; len >= 3; len--)
            {
                var ranksByLen  = GetRanksByLen(maxRanks, len);
                var rankSection = ranksByLen.Where(rl => ranksStr.IndexOf(rl) > -1).FirstOrDefault();
                if (rankSection != null)
                {
                    var rList        = rankSection.Split(',').Select(r => int.Parse(r)).ToList();
                    var disruptOrder = RandomUtil.DisruptOrder(rList);
                    ranksStr = ranksStr.Replace(rankSection, string.Join(",", disruptOrder));
                    break;
                }
            }

            return(ranksStr.Split(',').Select(r => int.Parse(r)).ToList());;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 计算名次
        /// minCostMatrix 的计数从0开始, 加1返回
        /// </summary>
        /// <returns></returns>
        private List <int> GetRanks(int[] minCostMatrix, List <BetRateModel> betRates)
        {
            var ranks = minCostMatrix.Select(m => m + 1).ToList();

            // 自然数升序的情况, 通常是因为无论什么顺序, 奖金都相同, 如只有一个用户下注1号车的10个名次都是大,且金额相同
            // 此时生成个随机数返回
            var rankStr = string.Join(",", ranks);

            // 用户下注1-9号车, 10没下注, 结果为 10,1,2,3,4,5,6,7,8,9, 后9位如果奖金相同, 后9位生成随机顺序
            var motoRates = betRates.GroupBy(r => r.Num).Select(g => new { Num = g.Key, Val = g.Sum(r => r.Rate) }).ToList();
            // 按奖金分组, 如果每组长度有超过2的, 这组如果在计算结果中是按升序存在的, 则打乱顺序
            var valRates = motoRates.GroupBy(r => r.Val).Select(g => new { Val = g.Key, Count = g.Count() }).ToList();

            foreach (var valRate in valRates)
            {
                if (valRate.Count > 2)
                {
                    var motoNums    = motoRates.Where(r => r.Val == valRate.Val).Select(r => r.Num).OrderBy(num => num).ToList();
                    var motoNumsStr = string.Join(",", motoNums);
                    if (rankStr.IndexOf(motoNumsStr) > -1)
                    {
                        var disruptOrder = RandomUtil.DisruptOrder(motoNums);
                        rankStr = rankStr.Replace(motoNumsStr, string.Join(",", disruptOrder));
                    }

                    ranks = rankStr.Split(',').Select(r => int.Parse(r)).ToList();
                }
            }

            // 调高中奖几率
            ranks = ImproveWinningRate(betRates, ranks);

            // 如果存在超过2个以上的连续数字, 如: 10,1,2,3,4,5,6,7,8,9 中的1,2,3,4,5,6,7,8,9 , 则将1,2,3,4,5,6,7,8,9打乱
            ranks = ReOrderRanks(betRates, ranks);

            return(ranks);
        }