抽奖-随机加权算法

news/2024/11/15 15:47:04/文章来源:https://www.cnblogs.com/thcn/p/18548091
package lotteryimport ("fmt""math/rand""sort""time"
)type Lottery struct {
}func NewLottery() *Lottery {return &Lottery{}
}type Prize struct {Name   stringStock  intWeight 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 []inttotalWeight := 0for _, item := range prizeList {totalWeight = item.Weight + totalWeightweightRanges = 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)}
}

  权重值约大,中奖概率越大。逻辑是控制随机数落到每个奖品的范围概率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834069.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸣潮,原神PC端启动器】仿二次元手游PC端游戏启动器,以鸣潮为例。

二游GAMELanucher启动器 1.前言许多二次元手游(原神,鸣潮,少女前线)的PC端启动器都是使用Qt做的,正好最近正在玩鸣潮,心血来潮,便仿鸣潮启动器,从头写一个。先下载一个官方版的PC启动器,找到图标,背景图等素材,然后对着界面写代码就行。效果如下2. 划分模块游戏启动…

css动态检测视口屏幕的尺寸

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>css动态检测屏幕的视口尺寸</title><…

自定义注解进行数据脱敏

前言 有些时候,我们可能对输出的某些字段要做特殊的处理在输出到前端,比如:身份证号,电话等信息,在前端展示的时候我们需要进行脱敏处理,这时候通过自定义注解就非常的有用了。在Jackson中要自定义注解,我们可以通过@JacksonAnnotationsInside注解来实现,如下示例: 一…

openVAS安装记

项目需要使用openVAS 安装步骤 我这里使用的是Ubuntu最新版,因为Ubuntu和debian可通过官网仓库进行安装,因改名为gvm 后续直接上操作 #安装 sudo apt install gvm -y #初始化(可能时间比较长,台会去下载数据库) sudo gvm-setup# 开机自启服务 sudo systemctl enable notus-…

爆火的外卖霸王餐项目,怎么做?

微客云以下是一些做爆火的外卖霸王餐项目的方法: ### 明确项目定位与目标- **确定核心目标**:明确是为了增加新用户、提高复购率、提升品牌知名度还是收集用户反馈等,不同目标决定后续策略 。- **精准定位用户群体**:了解目标用户的消费习惯、喜好、需求及消费能力等,如上…

轮廓线DP

讲解轮廓线DP的两种常见形式以及例题。更新日志概念 类似于状态压缩DP,但我们储存的是轮廓线上的状态。 有些时候,也不需要进行状态压缩,而可以用某一点的状态代表一个区域的状态。 思路 轮廓线就是已经决策的与尚未决策的部分的分界线,我们储存分界线上已经决策过的所有节…

Nuxt.js 应用中的 schema:written 事件钩子详解

title: Nuxt.js 应用中的 schema:written 事件钩子详解 date: 2024/11/15 updated: 2024/11/15 author: cmdragon excerpt: schema:written 钩子是 Vite 提供的一种生命周期钩子,在模式写入完成后调用。通过这个钩子,开发者可以在配置被正式应用之后执行一些后续操作,比如记…

概率与期望基础

实验、结果、样本空间、事件 事件 \(A\) 是否发生取决于一系列影响它的因素,这些因素影响 \(A\) 的过程称为一次 experiment 实验 或 trial 试验 一次试验的 result 结果 称为它的 outcome 结局。\(\text{result}\) 指由原因所引起的结果 \(\text{outcome}\) 强调事件特有的结…

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明 @目录4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明前言1. Ribbon 介绍1.1 LB(Load Balance 负载均衡)2. Ribbon 原理2.2 Ribbon 机制3. Spring Cloud Ribbon 实现负载均衡算法-应用实例4. 总结:5. 最后:前…

WSL2的介绍和使用

WSL2的介绍和使用 一、什么是WSL2? WSL是Windows Subsystem for Linux的简称,它是微软为Win10和Win11引入的一项功能。WSL允许用户在Windows上运行Linux操作系统及其相关命令和应用程序,而无需使用虚拟机或安装双系统。 1.1 WSL2与WSL1、传统虚拟机比较WSL1:没有完整的Linu…

插件大总结

加注释插件搜索接口插件mybatis-plus插件

Windows系统日志报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203是怎么回事?

当我们检查Windows系统日志发现有一个报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203。导致报错的原因是什么?该如何处理?驰网飞飞和你分享当我们检查Windows系统日志发现有一个报错:…