首页 > 编程语言 >抽奖-随机加权算法

抽奖-随机加权算法

时间:2024-11-15 15:42:19浏览次数:1  
标签:抽奖 Lottery int 算法 随机 func return weightRanges prizes

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)
	}
}

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

标签:抽奖,Lottery,int,算法,随机,func,return,weightRanges,prizes
From: https://www.cnblogs.com/thcn/p/18548091

相关文章

  • 并行排序算法:双调排序
    引入有一个排列,你可以通过“比较并交换”这个操作将该排列排好序,即,每次选择一对数\((i,j)\),若\(a_i>a_j\)则交换,否则不交换。但是,你可以把多对\((i,j)\)放在一次操作里并行“比较并交换”,此时操作数记1,与数对的对数无关,但是每个\(i\)只能出现至多一次。要求操作数最小。......
  • 论文分享:DiskANN查询算法
    详细总结了三篇有关DiskANN最邻近查询图算法的论文欢迎大家来点赞,更欢迎感兴趣的友友来探讨!DiskANN的提出(NurIPS’19)文献分享:Vamana图算法以及面向SSD的DiskANN文章浏览阅读797次,点赞21次,收藏8次。NurIPS‘19_vamana图索引https://blog.csdn.net/qq_64091900/article/det......
  • cmu15545笔记-Join算法(Join Algorithms)
    目录OverviewNestedLoopJoinNaïveBlockIndexSort-MergeJoinHashJoinSimpleHashJoinPartitionHashJoin总结Overview输出形式:早物化与晚物化(OLAP一般都是晚物化)代价分析:一般用IO次数计算(最终结果可能落盘,也可能不落盘,所以我们只计算输出结果之前的IO次数)。Join左边称为......
  • L4 垃圾邮件数据集分类延申 - NB/KNN/SVC/随机森林
    目录背景代码1.数据准备-1阶段2.数据探索3.数据准备-2阶段4.矢量化(向量化)5. 建立模型6.模型评价模型评价1.分别评价2.总体评价背景基于前文 (《【机器学习】Lesson4-朴素贝叶斯(NB)文本分类》)对于垃圾邮件数据集的分类处理,增加K邻居分类器(KNN)/支持向量......
  • python实现的扫雷游戏的AI解法(启发式算法)
    相关:python编写的扫雷游戏如何使用计算机程序求解扫雷游戏本文中实现的《扫雷》游戏的AI解法的项目地址:https://openi.pcl.ac.cn/devilmaycry812839668/AI_mine_game该项目的解法效果:之前介绍了网上的一些解决《扫雷》游戏的一些解法,包括DQN和启发式等AI算法,看着这......
  • 【算法】二分查找
    基本内容提高在有序的数组中查找满足某一条件的索引二分查找的基本类型①有多种情况满足条件,找到满足条件的最右索引,例如找到值为4的最右索引(也可以换为小于5的最后一个元素)​ ②有多种情况满足条件,找到满足条件的最左索引,例如找到大于4的第一个元素...​ ③仅存......
  • 视频智能分析网关反光衣检测算法在提升工人安全意识方面有哪些优势?
    在工业自动化和智能制造的浪潮中,工作场所的安全监控正变得越来越重要。反光衣检测视频分析网关正是为了满足这一需求而设计的高性能、低功耗的AI边缘计算硬件设备。以下是对视频智能分析网关视频分析网关的介绍,以及反光衣检测算法在提升工人安全意识方面的优势分析。一、产品介......
  • 某app最新版 vmp算法分析一
    本系列预计3篇某app使用了一种X开头的HTTP签名。该应用程序对服务器的请求在其标头中有6个x签名。该应用程序通常使用此签名来确保数据的安全性和完整性。代号花露水.6个x签名都来自古希腊神话中的某个神.分别是蛇发女妖(G),柯罗诺斯(K,时间之神),拉顿(L),阿尔戈斯(A),赫利......
  • Java 常用加密解密算法
    Java常用加密解密算法 概要  加密算法是一种用数学方法对数据进行变换的技术,目的是保护数据的安全,防止被未经授权的人读取或修改。加密算法可以分为三大类:对称加密算法、非对称加密算法和哈希算法(也叫摘要算法)。  本文来梳理下开发中常用到的数据编码中的Base64以及常......
  • 百度 2025届秋招提前批 文心一言大模型算法工程师
    文章目录个人情况一面/技术面1h二面/技术面1h三面/技术面40min个人情况先说一下个人情况:学校情况:211本中9硕,本硕学校都一般,本硕都是计算机科班,但研究方向并不是NLP,而是图表示学习论文情况:1A(NeurIPS)+1B(ICDM)已录用,还有一篇A会(AAAI2025)最近快出结果了,以及一......