在这里你只需要给出一个红包个数,给出一个红包总金额,通过一下算法可以分配指定个数的两位小数金额。
首先,定义一个可以获取指定取值区间的随机数数组。
/// <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; } }