随机抢红包算法实现

在这里你只需要给出一个红包个数,给出一个红包总金额,通过一下算法可以分配指定个数的两位小数金额。

首先,定义一个可以获取指定取值区间的随机数数组。

        /// <summary>
        /// 生成指定大小区间长度随机数组
        /// </summary>
        /// <param name="length">数组长度</param>
        /// <param name="min">最小值</param>
        /// <param name="max">最大值</param>
        /// <returns>指定长度数组</returns>
        public static int[] GenerateRandomIntList(int length, int min, int max)
        {
            int[] IntList = new int[length];
            for (int i = 0; i < length; i++)
            {
                Random randomNum = new Random(i);
                IntList[i] = randomNum.Next(min, max);
            }
            return IntList;
        }

定义一个可以随机获取红包的类,在这里我们用数据库的一个字段来记录随机金额,然后根据用户参加时的顺序,依次发放红包。

strHongbaoRecord就是记录每个人获得的红包金额,只需要在发红包时匹配发送就可以啦!

经测试,随机计算出来的总数由于最后会进行2位小数转换,所以可能会存在0.01元的误差,所以在最后一个红包对不同情况进行补差,这样就可以完美按照红包个数和金额进行发放了。

/// <summary>
        /// 创建一个随机红包活动
        /// </summary>
        /// <param name="ActiveName">活动名称</param>
        /// <param name="ActiveStartDate">活动开始时间</param>
        /// <param name="ActiveEndDate">活动结束时间</param>
        /// <param name="HBCount">红包数量</param>
        /// <param name="Cost">红包金额</param>
        /// <param name="maxNum">最大红包金额</param>
        /// <param name="minNum">最小红包金额</param>
        /// <param name="ActiveCode">活动代码</param>
        /// <returns>活动对象</returns>
        public ACTRF CreateActiveHongbao(string ActiveName, DateTime ActiveStartDate, DateTime ActiveEndDate, int HBCount,decimal Cost , int maxNum, int minNum, string ActiveCode)
        {
            var actrf = DBHelper.ACTRF.FirstOrDefault(rf => rf.RF009.Equals(ActiveCode));
            if (actrf != null)
            {
                return actrf;
            }
            else
            {
                ACTRF newactrf = new ACTRF();
                newactrf.RF001 = ActiveName;
                newactrf.RF002 = ActiveStartDate;
                newactrf.RF003 = ActiveEndDate;
                newactrf.RF004 = HBCount;
                newactrf.RF005 = maxNum;
                newactrf.RF006 = minNum;
                string strHongbaoRecord="";//总金额内随机金额字符
                int[] HongbaoRecord=ToolKit.GenerateRandomIntList(HBCount,minNum,maxNum);//随机红包数组
                decimal Randomsum= (decimal)HongbaoRecord.Sum();//获取随机数之和,计算红包比例
                decimal CountRandom=0;//随机函数获得总金额
                for(int i=0;i<HongbaoRecord.Length;i++)
                {
                    var decimalMoney = (((decimal)HongbaoRecord[i] / Randomsum) * Cost);//同等比例获取红包金额
                   var mathRandom=Math.Round(decimalMoney, 2);//获取保留2位小数的随机数
                   CountRandom += mathRandom;
                   //在最后一条记录中补差
                    if (i + 1 == HongbaoRecord.Length)
                    {
                       CountRandom= CountRandom - mathRandom;//排除最后一条数据
                       decimal RandomFenpei = CountRandom - Cost;
                        if (RandomFenpei > 0)
                        {
                            mathRandom = CountRandom - Cost;//减少多余金额
                        }
                        else if (RandomFenpei < 0)
                        {
                            mathRandom = Cost - CountRandom;//增加多余金额
                        }
                        CountRandom += mathRandom;//添加整理后的最后一条数据
                    }
                     strHongbaoRecord +=  mathRandom+ ",";
                }
                newactrf.RF007 = strHongbaoRecord.Substring(0, strHongbaoRecord.Length-1);
                newactrf.RF008 = ActiveName + "活动,红包总金额" + Cost + ",总个数" + HBCount + "发放金额共:" + CountRandom;
                newactrf.RF009 = ActiveCode;
                newactrf.RF010 = Cost;
                DBHelper.ACTRF.InsertOnSubmit(newactrf);
                DBHelper.SubmitChanges();
                return newactrf;
            }
        }
原文地址:https://www.cnblogs.com/loyung/p/6223497.html