為什么?
朋友搞一個了公眾號雕沿,找我?guī)兔﹂_發(fā)一個功能练湿。
他最近為了提高公眾號的用戶粘性,需要增加一個功能审轮,那就是用戶可以點擊公眾【每日禮包】的按鈕肥哎,實現(xiàn)抽獎,獲得各種獎勵等等疾渣。
實現(xiàn)起來其實挺簡單的篡诽,時序圖如下:
實現(xiàn)
由于之前已經(jīng)配置好了后臺服務(wù)器的事件監(jiān)聽,其實這次主要做的工作就是實現(xiàn)抽獎功能榴捡。
簡單分析一下杈女,創(chuàng)建一個簡單的抽獎程序需要考慮幾個關(guān)鍵點:獎品的配置、概率的計算以及抽獎算法。
下面是一個簡單的示例:
package web_activity
import (
"fmt"
"math/rand"
)
type PrizeType int64
const (
LotteryTypeDay PrizeType = 1001 // 日卡
LotteryTypeWeek PrizeType = 1002 // 周卡
LotteryTypeMonth PrizeType = 1003 // 月卡
LotteryTypeSeason PrizeType = 1004 // 季卡
LotteryTypeYear PrizeType = 1005 // 年卡
LotteryTypeNum50 PrizeType = 50 // 增加50次聊天
LotteryTypeNum20 PrizeType = 20 // 增加20次聊天
LotteryTypeNum100 PrizeType = 100 // 增加100次聊天
// ...
)
// Prize 定義了獎品及其概率
type Prize struct {
PrizeType PrizeType // 獎品類型
Probability float64 // 中獎概率
}
// Lottery 抽獎程序
type Lottery struct {
Prizes []Prize // 獎品列表
}
// NewLottery 創(chuàng)建一個新的Lottery實例
func NewLottery(prizes []Prize) *Lottery {
return &Lottery{Prizes: prizes}
}
// Draw 執(zhí)行抽獎過程
func (l *Lottery) Draw() *Prize {
var sum float64
for _, prize := range l.Prizes {
sum += prize.Probability
}
r := rand.Float64()
var s float64
for _, prize := range l.Prizes {
s += prize.Probability
if r <= s {
return &prize
}
}
return nil
}
func main() {
prizes := []Prize{
{LotteryTypeNum20, 0.2},
{LotteryTypeNum50, 0.1},
{LotteryTypeNum100, 0.05},
{LotteryTypeDay, 0.05},
{LotteryTypeWeek, 0.001},
{LotteryTypeMonth, 0.0005},
{LotteryTypeSeason, 0.00001},
{LotteryTypeYear, 0.000001},
}
lottery := NewLottery(prizes)
for i := 0; i < 10; i++ {
fmt.Println("抽獎結(jié)果:", lottery.Draw())
}
}
在這個程序中碧信,我定義了Prize
結(jié)構(gòu)體來表示獎品和它們對應(yīng)的概率。Lottery
結(jié)構(gòu)體包含了一個獎品列表街夭,并提供了一個Draw
方法來執(zhí)行抽獎過程砰碴。
在Draw
方法中生成一個[0,1)范圍內(nèi)的隨機數(shù),根據(jù)獎品的概率區(qū)間來確定中獎的獎品板丽。
這段代碼其實實現(xiàn)的是一個權(quán)重隨機選擇器呈枉,其原理基于累積分布函數(shù)(Cumulative Distribution Function, CDF):
r := l.random.Float64()
:生成了一個介于0到1之間的隨機浮點數(shù)。這個數(shù)可以被看作是在概率分布線上的一個點埃碱。for _, prize := range l.Prizes
:這個循環(huán)遍歷所有的獎品猖辫。s += prize.Probability
:在循環(huán)中,每個獎品的概率都被累加到s
變量中砚殿。這個累加過程構(gòu)建了一個概率的累積分布啃憎,其中s
的值在每次迭代后都會增加,直到最后一個獎品的概率被加上似炎。if r <= s
:這個條件檢查隨機數(shù)r
是否小于或等于當前的累積概率s
辛萍。由于概率是累積的,每個獎品都對應(yīng)了概率線上的一個區(qū)段羡藐。如果r
落在某個獎品對應(yīng)的區(qū)段內(nèi)贩毕,那么這個獎品就是被選中的獎品。
這個方法確保了每個獎品被選中的概率與其設(shè)定的概率相匹配仆嗦。舉一個簡單的例子:
假設(shè)有三個獎品辉阶,概率分別為0.2、0.3和0.5瘩扼。概率線如下:
|-----0.2-----|-------0.3-------|------------0.5------------|
如果
r
介于0到0.2之間谆甜,第一個獎品被選中。如果
r
介于0.2到0.5之間(0.2 + 0.3)邢隧,第二個獎品被選中店印。如果
r
介于0.5到1之間(0.2 + 0.3 + 0.5),第三個獎品被選中倒慧。
這種方法簡單高效按摘。
效果圖
公眾號菜單:
測試抽獎100次,中獎次數(shù)大約占據(jù)40纫谅,綜合中獎率足夠了炫贤,再說了概率這東西,隨時都可以調(diào)整付秕。
以上就是所有的過程了~希望各位看官賞臉點個贊哈??