在這里你只需要給出一個紅包個數,給出一個紅包總金額,通過一下算法可以分配指定個數的兩位小數金額。
首先,定義一個可以獲取指定取值區間的隨機數數組。
/// <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; } }