远浅
理解他人,内省自己。

按概率抽奖算法的Golang简单实现

远浅发表于: 2020-01-15 07:21分类: 技术

春节临近,运营那边又有那种迎合节日气氛进行的抽奖活动,我主要负责了抽奖算法,来说说简单的实现吧。

按概率抽取奖品可以简单的转化为一个数学模型,随机抽取一次数值,落在某个区间,则为此次抽奖结果。单区间长度的占总区间的比例则为中奖概率。

下面是一个简单的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,可能需要进行递归操作再次进行抽奖。

赠人玫瑰, 手有余香。🌹
打赏
发表评论
评论列表
评论努力加载中