隨機搶紅包算法實現


在這里你只需要給出一個紅包個數,給出一個紅包總金額,通過一下算法可以分配指定個數的兩位小數金額。

首先,定義一個可以獲取指定取值區間的隨機數數組。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM