zoukankan      html  css  js  c++  java
  • 随机抢红包算法实现

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

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

            /// <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;
                }
            }
  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/loyung/p/6223497.html
Copyright © 2011-2022 走看看