随机抢红包算法实现

发布时间:2017-3-27 16:36:31 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"随机抢红包算法实现 ",主要涉及到随机抢红包算法实现 方面的内容,对于随机抢红包算法实现 感兴趣的同学可以参考一下。

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

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

        /// <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;            }

上一篇:移动端全兼容的flexbox速成班
下一篇:2016 工作、生活与得失

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款