抽奖-随机加权算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | package lottery import ( "fmt" "math/rand" "sort" "time" ) type Lottery struct { } func NewLottery() *Lottery { return &Lottery{} } type Prize struct { Name string Stock int Weight int //权重 } // SortPrizes 按权重生序 func (l *Lottery) SortPrizes(prizes []Prize) { sort.Slice(prizes, func (i, j int) bool { return prizes[i].Weight < prizes[j].Weight }) } // CreateWeightRanges 创建权重区间 func (l *Lottery) CreateWeightRanges(prizeList []Prize) []int { var weightRanges []int totalWeight := 0 for _, item := range prizeList { totalWeight = item.Weight + totalWeight weightRanges = append(weightRanges, totalWeight) } return weightRanges } func (l *Lottery) DrawPrize(prizeList []Prize, weightRanges []int) string { //生成一个随机数 //播种 rand.Seed(time.Now().UnixNano()) randNum := rand.Intn(weightRanges[len(weightRanges)-1]) fmt.Println( "随机数=" , randNum) fmt.Println( "权重slice=" , weightRanges) for i, rangeNum := range weightRanges { if randNum < rangeNum { return prizeList[i].Name } } return "" } func TestDraw() { // 定义奖品信息及库存 prizes := []Prize{ { "一等奖 iPhone 16 Max" , 1, 1}, { "二等奖 iPad" , 1, 1}, { "三等奖 苹果耳机" , 1, 1}, { "四等奖 红米手机" , 5, 4}, { "五等奖 苹果手机充电器" , 10, 5}, { "六等奖 红牛" , 20, 8}, { "七等奖 矿泉水" , 20, 10}, { "八等奖 微信10元立减金" , 30, 12}, { "九等奖 微信3元立减金" , 30, 14}, } p := NewLottery() p.SortPrizes(prizes) weightRanges := p.CreateWeightRanges(prizes) for i := 0; i < 1; i++ { result := p.DrawPrize(prizes, weightRanges) fmt.Printf( "抽中奖品:%s\n" , result) } } |
权重值约大,中奖概率越大。逻辑是控制随机数落到每个奖品的范围概率。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异