//如果存在超过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());; }
/// <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); }