用.NET Core实现一个类似于饿了吗的简易拆红包功能
需求說明
以前很討厭點外賣的我,最近中午經(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ī)則
紅包初始化信息
接下來我們就可以通過消費金額獲取相應的紅包信息了。
隨機紅包的生成時機及處理
隨機紅包的生成可以在搶之前生成也可以在搶的過程中確定,一般而言,很多時候紅包會在搶的過程中動態(tài)的實際分配,不過在本文中,紅包在用戶分享成功后會預先生成,主要原因是為了更好地處理處理數(shù)據(jù),以使得數(shù)據(jù)能夠服從正態(tài)分布。
以下是其流程圖,其中有一段邏輯是回調(diào)功能,可能會有圈友會問,如何保證有回調(diào)以及回調(diào)是成功的,這個地方有很多種處理,比如MQ、任務調(diào)度等,此處也不做討論
那么我們需要設(shè)計一個新的實體,以表示分享出去的紅包及其生成的隨機紅包:
在實現(xiàn)過程中,根據(jù)用戶消費金額獲取相應紅包,然后通過隨機數(shù),生成n-1個原始的隨機數(shù)據(jù),最后一個數(shù)據(jù)用總和減去n-1個數(shù)據(jù)的和獲取到。
然后通過設(shè)置好系數(shù),以處理數(shù)據(jù)達到服從正太分布的目的:
經(jīng)過第二次處理后,得到的數(shù)據(jù)與原始數(shù)據(jù)有偏差,那么我們通過等比例方式再次處理,以確保拆分后的紅包總額等于紅包原始總額:
測試
測試效果圖如下:
部分代碼如下,
總結(jié)
以上是生活随笔為你收集整理的用.NET Core实现一个类似于饿了吗的简易拆红包功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TIOBE 6月排行:C# 以微弱的优势
- 下一篇: ASP.NET Core 管道再探