欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用.NET Core實現(xiàn)餓了嗎拆紅包功能

 更新時間:2019年07月07日 11:11:48   作者:艾心❤  
這篇文章主要介紹了使用.NET Core實現(xiàn)餓了嗎拆紅包功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

需求說明

以前很討厭點外賣的我,最近中午經(jīng)常點外賣,因為確實很方便,提前點好餐,算準時間,就可以在下班的時候吃上飯,然后省下的那些時間就可以在中午的時候多休息一下了。

點餐結(jié)束后,會有一個好友分享紅包功能,雖說這個紅包不能提現(xiàn),但卻可以抵扣點餐費用,對于經(jīng)常點餐的人來說,直接用于抵扣現(xiàn)金確實是很大的誘惑,在點餐之后所獲得的那個紅包,必須要分享出去才能拆。

那么如果自己也想實現(xiàn)以下?lián)尲t包功能,需要說明的是,本文所描述的紅包功能更多的關(guān)注與隨機紅包的生成,至于高并發(fā)、數(shù)據(jù)一致性等問題,本文暫未涉及,以下是本文所討論的兩個技術(shù)點:

不同的消費金額獲取的紅包總額不同,消費金額越大,紅包總額就越大,紅包總數(shù)也就越多;假設(shè)有一天,有一種需求是,需要保證參與搶紅包的人獲得的紅包金額在平均數(shù)附近波動,也就是盡量的服從正態(tài)分布;

功能實現(xiàn)

本文描述的場景,所涉及到的金額以分為單位,目的是為了更好的處理隨機數(shù)??傮w的示意圖如下:

消費后紅包的初始化

需求重點,用戶分享出去的紅包總額跟消費總額成正比,可以分拆的子紅包個數(shù)也與消費總額成正比。

比如:

10-20元的消費金額,可以分享的單個紅包金額為10元,可以供5個人搶20-40元的消費金額,可以分享的單個紅包金額為20元,可以供8個人搶40-60元的消費金額,可以分享的單個紅包金額為30元,可以供10個人搶60-100元的消費金額,可以分享的單個紅包金額為40元,可以供10個人搶100元以上的消費金額,可以分享的單個紅包金額為50元,可以供10個人搶

那么我們設(shè)計出來一個實體,用于表示紅包信息,以方便的配置及調(diào)整紅包規(guī)則

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>
  /// 紅包可被分割的數(shù)量
  /// </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
    }
  };
}

接下來我們就可以通過消費金額獲取相應(yīng)的紅包信息了。

隨機紅包的生成時機及處理

隨機紅包的生成可以在搶之前生成也可以在搶的過程中確定,一般而言,很多時候紅包會在搶的過程中動態(tài)的實際分配,不過在本文中,紅包在用戶分享成功后會預(yù)先生成,主要原因是為了更好地處理處理數(shù)據(jù),以使得數(shù)據(jù)能夠服從正態(tài)分布。

以下是其流程圖,其中有一段邏輯是回調(diào)功能,可能會有圈友會問,如何保證有回調(diào)以及回調(diào)是成功的,這個地方有很多種處理,比如MQ、任務(wù)調(diào)度等,此處也不做討論

那么我們需要設(shè)計一個新的實體,以表示分享出去的紅包及其生成的隨機紅包:

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; }
}

在實現(xiàn)過程中,根據(jù)用戶消費金額獲取相應(yīng)紅包,然后通過隨機數(shù),生成n-1個原始的隨機數(shù)據(jù),最后一個數(shù)據(jù)用總和減去n-1個數(shù)據(jù)的和獲取到

//紅包隨機拆分
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);

然后通過設(shè)置好系數(shù),以處理數(shù)據(jù)達到服從正太分布的目的:

//正太分布處理
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;
}

經(jīng)過第二次處理后,得到的數(shù)據(jù)與原始數(shù)據(jù)有偏差,那么我們通過等比例方式再次處理,以確保拆分后的紅包總額等于紅包原始總額:

//生成最終的紅包數(shù)據(jù)
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("-------------------------------------------------------");
 }

總結(jié)

以上所述是小編給大家介紹的使用.NET Core實現(xiàn)餓了嗎拆紅包功能,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

相關(guān)文章

  • 輕松解決asp.net用戶ASPNET登錄失敗問題的方法分享

    輕松解決asp.net用戶ASPNET登錄失敗問題的方法分享

    這篇文章介紹了asp.net用戶ASPNET登錄失敗問題的方法,有需要的朋友可以參考一下
    2013-11-11
  • .net5?使用Hangfire的過程記錄

    .net5?使用Hangfire的過程記錄

    最近項目遇到這樣的需求,需要實現(xiàn)根據(jù)領(lǐng)取時間改變優(yōu)惠券狀態(tài)的功能,本文給大家分享.net5?使用Hangfire的過程記錄,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • asp.net中利用ajax獲取動態(tài)創(chuàng)建表中文本框的值

    asp.net中利用ajax獲取動態(tài)創(chuàng)建表中文本框的值

    通常在做主從表的數(shù)據(jù)錄入中,會碰到在一個頁面上同時錄入主表數(shù)據(jù)和從表數(shù)據(jù),主表的數(shù)據(jù)只有一條,從表的數(shù)據(jù)有一條到多條,這樣就要動態(tài)創(chuàng)建從表數(shù)據(jù)錄入入口。
    2010-03-03
  • Asp.net Core 初探(發(fā)布和部署Linux)

    Asp.net Core 初探(發(fā)布和部署Linux)

    這篇文章主要介紹了Asp.net Core 初探(發(fā)布和部署Linux),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • .Net集成敏感詞組件的步驟

    .Net集成敏感詞組件的步驟

    現(xiàn)如今大部分服務(wù)都會有用戶輸入,為了服務(wù)的正常運行,很多時候不得不針對輸入進行敏感詞的檢測、替換。如果人工做這樣的工作,不僅效率低,成本也高。水弟在這里寫了一個讓小編姐姐都覺得快的敏感詞組件接入示例,不需要依賴第三方服務(wù),只需兩分鐘即可享受清爽文字。
    2021-05-05
  • 深入淺析WinForm 進程、線程及區(qū)別介紹

    深入淺析WinForm 進程、線程及區(qū)別介紹

    進程是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。這篇文章主要介紹了WinForm 進程、線程的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • TrieTree服務(wù)-組件構(gòu)成及其作用介紹

    TrieTree服務(wù)-組件構(gòu)成及其作用介紹

    本文將一步步教你配置和使用TrieTree服務(wù),需要的朋友可以參考下
    2013-01-01
  • 關(guān)于.net環(huán)境下跨進程、高頻率讀寫數(shù)據(jù)的問題

    關(guān)于.net環(huán)境下跨進程、高頻率讀寫數(shù)據(jù)的問題

    最近老大教給我一個項目,項目要求高頻次地讀寫數(shù)據(jù),數(shù)據(jù)量也不是很大,難點在于這個規(guī)模的熱點數(shù)據(jù),變化非常頻繁,下面把我的處理方法分享到腳本之家平臺,對.net跨進程高頻率讀寫數(shù)據(jù)相關(guān)知識感興趣的朋友跟隨小編一起學習下吧
    2021-05-05
  • Asp.Mvc?2.0用戶客戶端驗證實例講解(3)

    Asp.Mvc?2.0用戶客戶端驗證實例講解(3)

    這篇文章主要介紹了Asp.Mvc?2.0實現(xiàn)客戶端驗證功能,本文使用jquery.validate插件進行驗證,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • .NET中XML序列化和反序列化常用類和屬性小結(jié)

    .NET中XML序列化和反序列化常用類和屬性小結(jié)

    本文主要介紹了.NET中XML序列化和反序列化常用類和屬性小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04

最新評論