• 随机抢红包算法实现


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

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

            /// <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;
                }
            }
  • 相关阅读:
    ibmmq 性能测试
    zabbix-agent 安装
    关于dubbo接口性能测试
    关于vyos 防火墙配置
    appium自动化的工作原理(1)
    unittest如何在循环遍历一条用例时生成多个测试结果
    在Linux中#!/usr/bin/python之后把后面的代码当成程序来执行。 但是在windows中用IDLE编程的话#后面的都是注释,之后的代码都被当成文本了。 该怎么样才能解决这个问题呢?
    Cookie和Session的区别详解
    点单登录原理和java实现简单的单点登录
    new一个JAVA对象的时候,内存是怎么分配的?
  • 原文地址:https://www.cnblogs.com/loyung/p/6223497.html
Copyright © 2020-2023  润新知