尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
php简单抽奖算法(设置库存)
注意: probability(概率)之和必须100下面方法为简单没有库存public function draw() { $draw_list [ [ name 空奖(0-80), probability 80.00 ], [ name 5积分(80-90), probability 10.00 ], [ name 10积分(90-98), probability 8.00 ], [ name 20积分(98-100), probability 2.00 ], ]; // 生成一个0到100之间的随机数 $randomNum random_int(0, 100); $currentProbability 0; foreach ($draw_list as $draw_info) { $currentProbability $draw_info[probability]; if ($randomNum $currentProbability) { $draw_info[currentProbability] $currentProbability; $draw_info[randomNum] $randomNum; $draw_result $draw_info; break; } } $this-success(请求成功!, $draw_result); }含有库存写法public function draw_test() { $draw_list [ [ name 空奖(0-80), probability 80.00, stock 0 ], [ name 5积分(80-90), probability 10.00, stock 1 ], [ name 10积分(90-98), probability 9.9999999, stock 0 ], [ name 20积分(98-100), probability 0.0000001, stock 1 ], ]; // 修改这里调整支持的小数位数 $scale 100000000; // 整数溢出安全校验 $maxExpectTotalWeight 100 * $scale; // 预留1/2安全余量防止后续分摊权重后溢出 if ($maxExpectTotalWeight PHP_INT_MAX / 2) { $this-error(scale配置过大存在整数溢出风险请调小scale值); } $emptyTotalWeight 0; $validList []; foreach ($draw_list as $item) { $p (float)$item[probability]; $intWeight (int)round($p * $scale); if ($item[stock] 0) { $validList[] [ name $item[name], probability $item[probability], //保留原始概率 weight $intWeight, stock $item[stock] ]; } else { $emptyTotalWeight $intWeight; } } // 边界全部奖品库存为0 if (empty($validList)) { $this-error(暂无可用奖品); } // 将库存0的奖项权重分摊到有效奖品 if ($emptyTotalWeight 0) { $validCount count($validList); $avgAdd (int)($emptyTotalWeight / $validCount); $remainder $emptyTotalWeight % $validCount; //余数补到最后一项 foreach ($validList as $idx $v) { $v[weight] $avgAdd; if ($idx $validCount - 1) { $v[weight] $remainder; } } unset($v); } $totalWeight array_sum(array_column($validList, weight)); // 极端保护总权重不能小于1 if ($totalWeight 1) { $this-error(奖品权重合计异常); } $rand mt_rand(1, $totalWeight); $currentWeight 0; $draw_result null; foreach ($validList as $row) { $currentWeight $row[weight]; if ($rand $currentWeight) { $draw_result $row; $draw_result[rand] $rand; $draw_result[totalWeight] $totalWeight; break; } } $this-success(请求成功!, $draw_result); }
RELATED

相关推荐

WandEnhancer 完整指南:免费解锁 Wand(WeMod)专业版与手机远程控制

WandEnhancer 完整指南:免费解锁 Wand(WeMod)专业版与手机远程控制

WandEnhancer 完整指南:免费解锁 Wand(WeMod)专业版与手机远程控制 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer …

📅 2026/9/9 14:02:03
三菱PLC+MCGS触摸屏四路抢答器设计与组态实战

三菱PLC+MCGS触摸屏四路抢答器设计与组态实战

做这套四路抢答器,起因是朋友的工厂要办安全知识竞赛,问我说市场上买的成品抢答器不够灵活,想让我帮忙做一套。我手头正好有三菱PLC和MCGS触摸屏的现货,就顺手搭了一套。做完之后发现这套系统的含金量其实远不止“抢答”本身——它…

📅 2026/9/9 14:02:03
Nuxt全栈实践:Excel模板下载、上传解析与数据导入闭环

Nuxt全栈实践:Excel模板下载、上传解析与数据导入闭环

1. 一个看似简单却处处是坑的闭环需求 “下载模板 - 填写内容 - 上传导入”这个模式在业务系统里出现的频率,可能超出你的想象。后台批量导入用户、月考成绩录入、供应商资料收集、题库Excel导入、报名信息表批量更新……几乎每个管理系统都逃不掉这类操作。这个功能…

📅 2026/9/9 14:02:03
MORE NEWS

更多资讯

📰

Gemini API 错误处理 5 步排查法:从 429/503 到自动重试一次讲清

Gemini API 错误处理 5 步排查法:从 429/503 到自动重试一次讲清 【免费下载链接】cookbook Examples and guides for using the Gemini API 项目地址: https://gitcode.com/GitHub_Trending/coo/cookbook 调 Gemini API 的进程突然抛出 429 或 503&#xff…

📰

微信小程序校园兼职系统:Spring Boot+uniapp毕设项目全解析

简介:这是一套面向计算机相关专业毕业设计的微信小程序校园兼职管理系统完整源码包,基于uniapp实现小程序端、Spring Boot实现后端接口、Vue搭建管理端,配合MySQL数据库,适合用于毕业设计、课程设计或Java全栈项目学习。资源共179…

📰

手机话单分析软件重写:解决大文件解析与分析性能瓶颈

简介:手机话单分析软件改进版面向通信运营、客服稽核或日常需处理通话详单的个人用户,针对原始话单数据提供导入、统计与分析辅助,帮助快速梳理通话记录、费用构成与异常号码。程序基于.NET Framework 2.0运行,若环境缺少组件导致…

📰

中小企业SEO优化协议书怎么写?条款设计与避坑实操指南

做企业网站SEO这么多年,我接触过不少中小企业老板和运营负责人,发现一个很普遍的现象:谈起SEO优化,大家最关心的不是技术方案,而是“万一没效果怎么办”“对方承诺的排名没做到怎么算”。这个问题特别现实,…

📰

ADRC自抗扰控制仿真实战:MATLAB+Simulink参数整定与实现

简介:ADRC(自抗扰控制)MATLAB仿真资源包,面向自动控制专业学生、科研人员以及从事运动控制与工业过程控制的工程师。自抗扰控制通过扩张状态观测器实时估计并补偿系统内外扰动,本资源围绕这一核心思想,在MA…

📰

基于Hadoop的航班大数据分析系统设计与实现

1. 项目概述:这是一个什么样的系统1.1 航班分析系统要解决什么问题做这个项目之前,我先问了自己一个问题:航空公司每天产出海量航班数据,但真正能把这些数据用起来的人有多少?答案是很有限的。航班准点率、航线热度、延…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬