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;
                }
            }
  • 相关阅读:
    Codeforces 1291 Round #616 (Div. 2) B
    总结
    刷新DNS解析缓存+追踪+域名解析命令
    数学--数论--Hdu 5793 A Boring Question (打表+逆元)
    Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析
    LeetCode 117 Populating Next Right Pointers in Each Node II
    LeetCode 116 Populating Next Right Pointers in Each Node
    test test
    LeetCode 115 Distinct Subsequences
    LeetCode 114. Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/loyung/p/6223497.html
Copyright © 2011-2022 走看看