思路
提前将红包金额分配完成,等抢红包的人开始抢之后只需管理好这些红包是否抢到就可以了,从根源上简化红包的逻辑。
将固定的金额根据人数拆分成人数等量的红包,每个红包的金额随机。
随机的金额根据当前剩余金额和抢红包的人数来决定。
分配红包
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数据库中。
总之,量小随意,量大谨慎。