按概率抽奖算法的Golang简单实现
春节临近,运营那边又有那种迎合节日气氛进行的抽奖活动,我主要负责了抽奖算法,来说说简单的实现吧。
按概率抽取奖品可以简单的转化为一个数学模型,随机抽取一次数值,落在某个区间,则为此次抽奖结果。单区间长度的占总区间的比例则为中奖概率。
下面是一个简单的Golang实现
import (
"fmt"
"github.com/unliar/utils/go/math"
)
type Reward struct {
Key string // 商品名称
NumStart int // 区间开始值
NumEnd int // 区间结束值
}
// 权重抽奖逻辑 返回抽奖的key
func GetRandomWheel(r []Reward) string {
if len(r) == 0 {
panic("奖品不能为空!")
}
min := r[0].NumStart
max := r[0].NumEnd
key := ""
// 获取最大最小值
for index, item := range r {
if index > 0 {
if item.NumStart <= min {
min = item.NumStart
}
if item.NumStart >= max {
max = item.NumEnd
}
}
}
rt := math.GetRandomInt(max, min)
for _, item2 := range r {
if rt >= item2.NumStart && rt <= item2.NumEnd {
key = item2.Key
fmt.Println("命中,", rt, item2)
break
}
}
// 如果需要保持100%中奖概率,则必须保证抽奖key不能为空,而且必须有兜底奖品,否则会爆炸
if key == "" {
return GetRandomWheel(r)
}
return key
}
调整区间的开始值和结束值来调整区间的中奖概率。
调整奖励数组来增减奖品。
如果奖品出现区间断层,则无法抽到奖品Key,可能需要进行递归操作再次进行抽奖。
赠人玫瑰, 手有余香。🌹
打赏
特别鸣谢
感谢以下用户对本文的支持与鼓励
加载打赏用户中
发表评论
文章评论
暂无任何评论,快去发表吧~