怎样写一个红包随机算法

思路

提前将红包金额分配完成,等抢红包的人开始抢之后只需管理好这些红包是否抢到就可以了,从根源上简化红包的逻辑。

将固定的金额根据人数拆分成人数等量的红包,每个红包的金额随机。

随机的金额根据当前剩余金额和抢红包的人数来决定。

分配红包

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数据库中。

总之,量小随意,量大谨慎。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂紫萧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值