使用.NET Core怎么实现饿了吗拆红包功能
创始人
2024-11-27 13:26:45
0次

功能实现

本文描述的场景,所涉及到的金额以分为单位,目的是为了更好的处理随机数。总体的示意图如下:

使用.NET Core怎么实现饿了吗拆红包功能

消费后红包的初始化

需求重点,用户分享出去的红包总额跟消费总额成正比,可以分拆的子红包个数也与消费总额成正比。

比如:

10-20元的消费金额,可以分享的单个红包金额为10元,可以供5个人抢20-40元的消费金额,可以分享的单个红包金额为20元,可以供8个人抢40-60元的消费金额,可以分享的单个红包金额为30元,可以供10个人抢60-100元的消费金额,可以分享的单个红包金额为40元,可以供10个人抢100元以上的消费金额,可以分享的单个红包金额为50元,可以供10个人抢

那么我们设计出来一个实体,用于表示红包信息,以方便的配置及调整红包规则

public class RedPacketsInfo
{
/// 
/// 最大消费金额
/// 
public int MaxAmount { get; set; }
/// 
 /// 最小消费金额
  /// 
  public int MinAmount { get; set; }
  /// 
  /// 红包金额
  /// 
  public int TotalAmount { get; set; }
  /// 
  /// 红包可被分割的数量
  /// 
  public int RedPacketQuantity { get; set; }
}

红包初始化信息

private static List GetRedPackets()
{
  return new List()
  {
    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、任务调度等,此处也不做讨论

使用.NET Core怎么实现饿了吗拆红包功能

那么我们需要设计一个新的实体,以表示分享出去的红包及其生成的随机红包:

public class SharedRedPacket
{
  /// 
  /// 分享人UserId
  /// 
  public int SenderUserId { get; set; }
  /// 
  /// 分享时间
  /// 
  public DateTime SendTime { get; set; }
  public List RobbedRedPackets { get; set; }
}
public class RobbedRedPacket
{
  /// 
  /// 抢到红包的人的UserId
  /// 
  public int UserId { get; set; }
  /// 
  /// 抢到的红包金额
  /// 
  public int Amount { get; set; }
  /// 
  /// 抢到时间
  /// 
  public DateTime RobbedTime { get; set; }
}

在实现过程中,根据用户消费金额获取相应红包,然后通过随机数,生成n-1个原始的随机数据,最后一个数据用总和减去n-1个数据的和获取到

//红包随机拆分
Random ran = new Random();
List randoms = new List(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(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)
});

测试

测试效果图如下:

使用.NET Core怎么实现饿了吗拆红包功能

部分代码如下,

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("-------------------------------------------------------");
 }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...