手机版

使用 NET Core实现饥饿红包功能

时间:2021-08-21 来源:互联网 编辑:宝哥软件园 浏览:

需求描述

我以前讨厌叫外卖。最近经常中午点外卖,因为真的很方便。如果提前点好饭,算准时间,下班后可以吃个饭,然后在节省时间的中午休息一下。

点餐后,朋友会分享红包功能。这个红包虽然不能兑现,但是可以扣除点餐费用。对于经常点餐的人来说,直接用它来扣现金是很大的诱惑。订购后获得的红包,拆解前必须共享。

那么,如果要实现下面的抢红包功能,需要注意的是,本文描述的红包功能更注重随机红包的生成。对于高并发和数据一致性的问题,本文还没有涉及。以下是本文讨论的两个技术要点:

不同消费金额获得的红包总量不同。消费金额越大,红包总额越大,红包总额越多;假设有一天,需要保证参与红包的人获得的红包量在平均值附近波动,即尽可能服从正态分布;

功能实现

在本文描述的场景中,为了更好地处理随机数,所涉及的金额被分成多个单位。总体示意图如下:

消费后红包初始化

需求聚焦,用户共享的红包总量与总消费成正比,可拆分的子红包数量也与总消费成正比。

例如:

10-20元的消费金额可以10元分享,5个人可以用20元抢20-40元的消费金额,8个人用20元抢40-60元的消费金额,10个人用30元抢60-100元的消费金额,10个人用40元抢100元以上。

然后设计一个实体来表示红包信息,方便配置和调整红包规则

public class重新打包sinfo {///summary///最大消费金额////summary public int max amount { get;设置;}///汇总////最低消费金额////汇总公共int min amount { get设置;} ///summary ///红包金额////summary public int总金额{ get设置;}///summary////可划分的红包数////summary public int repacket quantity { get;设置;}}红包初始化信息

私有静态lisredpacketzinfo GetRedPackets(){返回new lisredpacketzinfo(){ new redpacketzinfo { Mina mount=1000,MaxAmount=2000,redpacketquantum=5,TotalAmount=1000 },new redpacketzinfo { Mina mount=2000,MaxAmount=3000,redpacketquantum=5,TotalAmount=1000 },new redpacketzinfo { Mina mount=4000,MaxAmount=6000,redpacketquantum=5,MaxValue,RedPacketQuantity=5,TotalAmount=1000 } }}

接下来,我们可以通过消费金额得到相应的红包信息。

随机红包的产生机会和处理

随机红包的生成可以在抓取之前或者抓取过程中生成。一般来说,在抓取的过程中,红包会被动态地实际分发。但是在本文中,红包会在用户共享成功后进行预创建,主要是为了更好的处理数据,让数据能够服从正态分布。

下面是它的流程图。其中一个逻辑是回调函数。有些圈友可能会问怎么保证回拨,回拨成功。这个地方的处理有很多种,比如MQ,任务调度,这里就不讨论了。

然后,我们需要设计一个新的实体来表示共享的红包和它们生成的随机红包:

公共类SharedRedPacket{ ///summary ///分享人UserId////summary public int sendererid { get;设置;} ///摘要///分享时间////摘要公共日期时间发送时间{获取设置;} public listrobbedpacket Robbedpackts { get;设置;} }公共类robbeddpacket {///summary///抢到红包的人的UserId////summary public int UserId { get;设置;} ///摘要///抢到的红包金额////汇总公共int Amount { get设置;} ///摘要///抢到时间////摘要公共DateTime RobbedTime { get设置;}}在实现过程中,根据用户消费金额获取相应红包,然后通过随机数,生成n-1个原始的随机数据,最后一个数据用总和减去n-1个数据的和获取到

//红包随机拆分Random ran=new Random();列表双随机=新列表双(RedpacketList .计数);for(int I=0;我用红色包装信息RedPacketQuantity-1;I){ int max=(TotalAmound-(Redpacketinfo .RedPacketQuantity-I))* 1;int结果=ran .下一个(1,最大值);兰多姆添加(结果);合计金额-=结果;}randoms .添加(合计金额);然后通过设置好系数,以处理数据达到服从正太分布的目的:

//正太分布处理for(int I=0;我用红色包装信息redpacketquantyi){ 0双a=数学Sqrt(数学。腹肌(2 *数学日志(随机[i],数学e)));双b=数学Cos(2 *数学PI * randoms[I]);randoms[I]=a * b * 0.3 1;}经过第二次处理后,得到的数据与原始数据有偏差,那么我们通过等比例方式再次处理,以确保拆分后的红包总额等于红包原始总额:

//生成最终的红包数据double d=原始总数/随机数.sum();SharedRedPacket SharedRedPacket=new SharedRedPacket();共享数据包.robbeddpackets=新列表robedpacket(red packets列表.计数);for(int I=0;我用红色包装信息RedPacketQuantity-1;i ){ sharedRedPacket .增加(新的robedcket { Amount=(int)Math .Round(randoms[i] * d,0)});}共享数据包.RobbedRedPackets。添加(新的数据包{金额=原始总额-共享数据包.总和(p=p。金额)});

测试

测试效果图如下:

部分代码如下,

控制台WriteLine(“”是否分享输入Y分享成功,输入普通退出');字符串结果=控制台ReadLine();if(result==' Y '){ var leftRedPacket=sharedRedPacket .其中(p=p.UserId=0).to list();var robbeddpacket=leftRedPacket[new Random().下一个(1,左侧数据包.计数1)];控制台WriteLine(“”抢到的到红包金额是:' robbedRedPacket .金额);控制台写入行('-');}总结

以上所述是小编给大家介绍的使用。净核心实现饿了吗拆红包功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

版权声明:使用 NET Core实现饥饿红包功能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。