这篇文章给大家介绍使用.NET Core怎么实现饿了吗拆红包功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
功能实现
本文描述的场景,所涉及到的金额以分为单位,目的是为了更好的处理随机数。总体的示意图如下:
消费后红包的初始化
需求重点,用户分享出去的红包总额跟消费总额成正比,可以分拆的子红包个数也与消费总额成正比。
比如:
10-20元的消费金额,可以分享的单个红包金额为10元,可以供5个人抢20-40元的消费金额,可以分享的单个红包金额为20元,可以供8个人抢40-60元的消费金额,可以分享的单个红包金额为30元,可以供10个人抢60-100元的消费金额,可以分享的单个红包金额为40元,可以供10个人抢100元以上的消费金额,可以分享的单个红包金额为50元,可以供10个人抢
那么我们设计出来一个实体,用于表示红包信息,以方便的配置及调整红包规则
public class RedPacketsInfo { /// <summary> /// 最大消费金额 /// </summary> public int MaxAmount { get; set; } /// <summary> /// 最小消费金额 /// </summary> public int MinAmount { get; set; } /// <summary> /// 红包金额 /// </summary> public int TotalAmount { get; set; } /// <summary> /// 红包可被分割的数量 /// </summary> public int RedPacketQuantity { get; set; } }
红包初始化信息
private static List<RedPacketsInfo> GetRedPackets() { return new List<RedPacketsInfo>() { new RedPacketsInfo { MinAmount = 1000, MaxAmount = 2000, RedPacketQuantity = 5, TotalAmount=1000 }, new RedPacketsInfo { MinAmount = 2000, MaxAmount = 3000, RedPacketQuantity = 5, TotalAmount=1000 }, new RedPacketsInfo { MinAmount = 4000, MaxAmount = 6000, RedPacketQuantity = 5, TotalAmount=1000 }, new RedPacketsInfo { MinAmount = 6000, MaxAmount = 8000, RedPacketQuantity = 5, TotalAmount=1000 }, new RedPacketsInfo { MinAmount = 10000, MaxAmount = int.MaxValue, RedPacketQuantity = 5, TotalAmount=1000 } }; }
接下来我们就可以通过消费金额获取相应的红包信息了。
随机红包的生成时机及处理
随机红包的生成可以在抢之前生成也可以在抢的过程中确定,一般而言,很多时候红包会在抢的过程中动态的实际分配,不过在本文中,红包在用户分享成功后会预先生成,主要原因是为了更好地处理处理数据,以使得数据能够服从正态分布。
以下是其流程图,其中有一段逻辑是回调功能,可能会有圈友会问,如何保证有回调以及回调是成功的,这个地方有很多种处理,比如MQ、任务调度等,此处也不做讨论
那么我们需要设计一个新的实体,以表示分享出去的红包及其生成的随机红包:
public class SharedRedPacket { /// <summary> /// 分享人UserId /// </summary> public int SenderUserId { get; set; } /// <summary> /// 分享时间 /// </summary> public DateTime SendTime { get; set; } public List<RobbedRedPacket> RobbedRedPackets { get; set; } } public class RobbedRedPacket { /// <summary> /// 抢到红包的人的UserId /// </summary> public int UserId { get; set; } /// <summary> /// 抢到的红包金额 /// </summary> public int Amount { get; set; } /// <summary> /// 抢到时间 /// </summary> public DateTime RobbedTime { get; set; } }
在实现过程中,根据用户消费金额获取相应红包,然后通过随机数,生成n-1个原始的随机数据,最后一个数据用总和减去n-1个数据的和获取到
//红包随机拆分 Random ran = new Random(); List<double> randoms = new List<double>(redPacketsList.Count); for (int i = 0; i < redPacketsInfo.RedPacketQuantity - 1; i++) { int max = (totalAmount - (redPacketsInfo.RedPacketQuantity - i)) * 1; int result = ran.Next(1, max); randoms.Add(result); totalAmount -= result; } randoms.Add(totalAmount);
然后通过设置好系数,以处理数据达到服从正太分布的目的:
//正太分布处理 for (int i = 0; i < redPacketsInfo.RedPacketQuantity; i++) { double a = Math.Sqrt(Math.Abs(2 * Math.Log(randoms[i], Math.E))); double b = Math.Cos(2 * Math.PI * randoms[i]); randoms[i] = a * b * 0.3 + 1; }
经过第二次处理后,得到的数据与原始数据有偏差,那么我们通过等比例方式再次处理,以确保拆分后的红包总额等于红包原始总额:
//生成最终的红包数据 double d = originalTotal / randoms.Sum(); SharedRedPacket sharedRedPacket = new SharedRedPacket(); sharedRedPacket.RobbedRedPackets = new List<RobbedRedPacket>(redPacketsList.Count); for (int i = 0; i < redPacketsInfo.RedPacketQuantity - 1; i++) { sharedRedPacket.RobbedRedPackets.Add(new RobbedRedPacket { Amount = (int)Math.Round(randoms[i] * d, 0) }); } sharedRedPacket.RobbedRedPackets.Add(new RobbedRedPacket { Amount = originalTotal - sharedRedPacket.RobbedRedPackets.Sum(p => p.Amount) });
测试
测试效果图如下:
部分代码如下,
Console.WriteLine("是否分享输入Y分享成功,输入N退出"); string result = Console.ReadLine(); if (result == "Y") { var leftRedPacket = sharedRedPacket.RobbedRedPackets.Where(p => p.UserId <= 0).ToList(); var robbedRedPacket = leftRedPacket[new Random().Next(1, leftRedPacket.Count + 1)]; Console.WriteLine("抢到的到红包金额是:" + robbedRedPacket.Amount); Console.WriteLine("-------------------------------------------------------"); }
关于使用.NET Core怎么实现饿了吗拆红包功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。