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;
                }
            }
  • 相关阅读:
    HDU 6182 A Math Problem 水题
    HDU 6186 CS Course 位运算 思维
    HDU 6188 Duizi and Shunzi 贪心 思维
    HDU 2824 The Euler function 欧拉函数
    HDU 3037 Saving Beans 多重集合的结合 lucas定理
    HDU 3923 Invoker Polya定理
    FZU 2282 Wand 组合数学 错排公式
    HDU 1452 Happy 2004 数论
    HDU 5778 abs 数论
    欧拉回路【判断连通+度数为偶】
  • 原文地址:https://www.cnblogs.com/loyung/p/6223497.html
Copyright © 2011-2022 走看看