可控概率抽奖算法

说明

本文PHP语言去实现,只实现核心可控概率引擎,库存判断等其它业务需要其它代码配合实现。

代码

/*** @function 封装可控概率的抽奖功能* @param    $arr        array  数据集合* @param    $weight_key string 权重字段* @return   array       被选中的元素*/
function controllableProbability($arr, $weight_key = 'weight') {$total_probability = 0;foreach($arr as $v) {$total_probability = bcadd($total_probability, $v[$weight_key], 2);}$rand = mt_rand(1, intval($total_probability));foreach ($arr as $val) {if ($rand <= $val[$weight_key]) {break;}$rand -= $val[$weight_key];next($arr);}//想要返回key,使用return key($arr);return current($arr);
}

调用

  1. weight权重概率字段,不是概率字段,不需要总和为100
  2. 如下,代表16个人抽奖,有10人是谢谢惠顾,有5人中2元,有1人中5元,有0人中50W。
$arr = [['id' => 1, 'name' => '谢谢惠顾', 'weight' => 10],['id' => 2, 'name' => '中2元', 'weight' => 5],['id' => 3, 'name' => '中5元', 'weight' => 1],['id' => 4, 'name' => '中50W', 'weight' => 0],
];
//参数1是数组,参数2是告诉controllableProbability函数哪个字段为改概率字段
controllableProbability($arr, 'weight');

验算

$a = 0; $b = 0; $c = 0; $d = 0;
for($i = 0; $i < 1600000; $i++) {$res = controllableProbability($arr, 'weight');if($res['id'] == 1) $a ++;if($res['id'] == 2) $b ++;if($res['id'] == 3) $c ++;if($res['id'] == 4) $d ++;
}
echo "$a $b $c $d";

3轮抽奖,每轮抽160万次,可得以下表格:

轮次谢谢惠顾实际次数谢谢惠顾期望值中2元实际次数中2元期望值中5元实际次数中5元期望值中50W实际次数中50W期望次
1999323100000050037450000010030310000000
21001144100000049873250000010012410000000
3999285100000050066250000010005310000000

以谢谢惠顾为例纵向对比:

项目第一轮第2轮第3轮
谢谢惠顾实际次数9993231001144999285
谢谢惠顾期望次数100000100000100000
谢谢惠顾实际概率62.46%62.57%62.46%
谢谢惠顾期望概率62.50%62.50%62.50%
误差率-0.04%+0.07%-0.04%

技术上:随机范围可控,但是随机值不可控,随机值可控就不叫随机了,有误差正常,本来随机就是个概率问题。
业务上:可通过库存的限制和其它业务逻辑来避免误差带来的问题。
数值上:若硬要实现0误差的精确控制,则需要动态获取权重值,抽中哪条数据,递减那条数据的权重值即可(同时要避免mt_rand();函数参数2小于参数1的情况出现)。

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

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

相关文章

colavoidance4

共有四个Matlab文件&#xff0c;main.m、AirCraft.m、Arena.m和mission_planner.m main.m 主文件比较简短&#xff0c;主要是模拟和控制无人机的飞行路径。 首先是一些初始定义和设置&#xff1a; num_of_UAVs 4: 定义无人机的数量为4。time 1300: 定义总时间为1300秒。s…

【算法分析与设计】无重复的最长子串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

九州金榜|如何做好家庭教育

孩子的家庭教育是每个家庭都要做的&#xff0c;也是每个家长面临的事情&#xff0c;同样不同的家庭教育教育出来的孩子性格也各不相同&#xff0c;有时候家长看别别人家的孩子品学兼优非常羡慕&#xff0c;很多家长会把问题归结到孩子身上&#xff0c;其实有没有想过是家庭教育…

机器学习算法与Python实战 | 2024年吴恩达预测:关于AI,这些事未来十年不会变

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;2024年吴恩达预测&#xff1a;关于AI&#xff0c;这些事未来十年不会变 2024年&#xff0c;AI的发展会有怎样的改变&#xff1f; 在吴…

CSDN文章导出工具

源码地址&#xff1a; github:https://github.com/lishuangquan1987/CSDNExportergitee:https://gitee.com/lishuangquan1987/csdnexporter 介绍 最近有CSDN博客导出来的需求&#xff0c;翻看了很多开源工具&#xff0c;都不能用或者不好用&#xff0c;于是决定自己做一个。…

docker swarm

1.准备三台机器&#xff0c;分别安装docker,例如IP分别为&#xff1a; 192.168.88.131&#xff0c;192.168.88.136&#xff0c;192.168.88.138 2.修改/etc/hostname 分别为&#xff1a; manger,node1,node2 3.分别修改/etc/hosts添加: 192.168.88.131 manger 192.168.88.13…

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型&#xff0c;功能虽然很强大&#xff0c;但对语言的支持和扩展比较差&#xff0c;例如&#xff0c;二者都是以英语为主的大模型。 为了提升大模型语言的多元化&#xff0c;慕尼黑大学、赫尔辛基大学等研究人员联合开源了&#xff0c;…

香港优才VS高才计划对比哪个好?详解申请条件、优缺点、续签转永居!

香港优才和高才计划对比哪个好&#xff1f;详解申请条件、优缺点、续签转永居&#xff01; 香港优才计划和香港高才通计划&#xff0c;都是热门的香港人才引进项目&#xff0c;在2023年&#xff0c;这两个项目为香港引进了超6万的优秀人才和高端人才&#xff0c;为香港经济发展…

CSRF:跨站请求伪造攻击

目录 什么是CSRF&#xff1f; DVWA中的CSRF low medium hight impossible 防御CSRF 1、验证码 2、referer校验 3、cookie的Samesite属性 4、Anti-CSRF-Token 什么是CSRF&#xff1f; CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&…

【Linux】静态库和动态库

动静态库 一、静态库1. 静态库概念2. 制作静态库&#xff08;1&#xff09;朴素方法 --- 不打包&#xff08;2&#xff09;对静态库打包 3. 使用静态库&#xff08;1&#xff09;朴素方法 --- 直接使用&#xff08;2&#xff09;使用打包好的静态库 二、动态库1. 动态库概念2. …

傅里叶变换在图像处理中的应用

傅里叶变换在图像处理中有着广泛的应用&#xff0c;因为它能将图像从空间域转换到频率域&#xff0c;使我们能够分析图像中的频率成分。以下是一些傅里叶变换在图像处理中的典型应用&#xff1a; 图像压缩&#xff1a;通过傅里叶变换&#xff0c;我们可以识别并去除图像数据中不…

jenkins 发布远程服务器并部署项目

安装参考另一个文章 配置maven 和 jdk 和 git 注意jdk的安装目录&#xff0c;是jenkins 安装所在服务器的jdk目录 注意maven的目录 是jenkins 安装所在服务器的maven目录 注意git的目录 是jenkins 安装所在服务器的 git 目录 安装 Publish Over SSH 插件 配置远程服务器 创…

不会Git也能玩Github吗?

不会Git也能玩Github吗&#xff1f; 前言使用Github的准备步骤使用一种访问外网资源的方法&#xff08;这一步才是新手最难的一步&#xff09;注册账号 创建一个自己的仓库创建完仓库后的界面 搜索你想要的代码类型以搜索坦克大战为例以下载烟花代码为例 总结 前言 说到Github&…

计算机自顶向下 Wireshark labs——DNS

如本文第2.4节所述&#xff0c;域名系统(DNS)将主机名转换为IP地址&#xff0c;在互联网基础设施中发挥着关键作用。在本实验中&#xff0c;我们将仔细研究DNS的客户端。回想一下&#xff0c;客户端在DNS中的角色相对简单—客户端向其本地DNS服务器发送查询&#xff0c;并收到响…

2023年06月CCF-GESP编程能力等级认证Python编程四级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A:编辑 B:保存 C:调试 D:编译 答案:D 第2题 排序算法是稳定的(Stable Sorting),就是指排序算…

Android Jetpack Compose之底部导航栏的实现

目录 1.概述2. 效果展示3. 代码实现3.1 定义底部导航栏的tab项3.2 整体页面架构搭建3.3 底部导航栏的实现3.4 所有代码 4.总结 1.概述 写过一段Android jetpack compose 界面的小伙伴应该都用过Compose的脚手架Scaffold&#xff0c;利用它我们可以很快的实现一个现代APP的主流…

Ubuntu使用Docker部署Nginx并结合内网穿透实现公网远程访问

文章目录 1. 安装Docker2. 使用Docker拉取Nginx镜像3. 创建并启动Nginx容器4. 本地连接测试5. 公网远程访问本地Nginx5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 在开发人员的工作中&#xff0c;公网远程访问内网是其必备的技术需求之一。对于…

为什么要进行网站内容监测?内容监测包括哪些方面?(国科云)

随着信息化的普及&#xff0c;网站已经成为企业和组织传递信息、与公众互动的重要平台。网站内容监测对于维护品牌形象&#xff0c;提升用户体验、防止不良信息传播等具有非常重要的作用。本文国科云简单介绍下进行内容监测的必要性以及内容监测包括哪些方面。 为什么要进行网…

基于YOLOv8的足球赛环境下足球目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量化&#xff1b;2&#xff09;目标检测、语义分割、OCR、分类等技术孵化&#xff0c;赋能智能制造&#xff0c;工业项目落地经验丰富&#xff1b; …

五、医学影像云平台 - 医共体

原创不易&#xff0c;多谢关注&#xff01;谢谢&#xff01; 1. 医学大影像设备市场现状 目前影像设备&#xff0c;可以说低端产品同质化越来越严重&#xff0c;利润越来越薄&#xff0c;而高端超高端设备&#xff0c;整体销售额却在增长&#xff0c;利润空间也比低端的要高的…