思路
提前將紅包金額分配完成,等搶紅包的人開始搶之後只需管理好這些紅包是否搶到就可以了,從根源上簡化紅包的邏輯。
將固定的金額根據人數拆分成人數等量的紅包,每個紅包的金額隨機。
隨機的金額根據當前剩餘金額和搶紅包的人數來決定。
分配紅包
var money =100; //紅包總金額
var num=5;
var list=new List<bag>();
for (int i = 0; i < num; i++)
{
var temp = getRandom(money, num - i);
money -= temp;
var item = new bag()
{
money = temp
};
list.Add(item);
}
其中:
money就是當前紅包的總金額。
num 是紅包的個數。
list是紅包分配之後的集合。
bag就是單獨的紅包對象。
getRandom是一個計算單個紅包金額的方法。
單個紅包金額計算
單個紅包的金額是根據當前剩餘的金額和剩餘的個數來計算。
此處使用保守算法,保證搶到紅包的每個人不至於運氣太差或者最高和最低的差別特別大。
Random rd = new Random();
/// <summary>
/// 根據人數,分配一個金額
/// </summary>
/// <param name="money">剩餘金額</param>
/// <param name="num">剩餘個數</param>
/// <returns></returns>
private decimal getRandom(decimal money, int num)
{
if (num == 1) return money;
var t1 = money / (num + 1);
var t2 = rd.Next(Convert.ToInt32(t1 * 100)) / 100m;
if (t1 + t2 > money) return t1;
return t1 + t2;
}
可以將紅包結果存入數據庫中,搶紅包的時候去查詢數據庫就可以了。也可以再存在內存或者類似Redis這樣的Nosql數據庫中。
總之,量小隨意,量大謹慎。