PHP几个常用的概率算法
时间:2020-03-27
本文章向大家介绍PHP几个常用的概率算法,主要包括PHP几个常用的概率算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说明:全概率计算为统一设置一个中奖概率;单独概率计算则每个奖品分别可以设置一个中奖概率;
算法一(全概率计算)<br/>
此类中奖概率为所有奖项设置一个总的中奖概率,中奖后再从已有的奖品里面随机抽一个奖品
中奖判断:
1.先按照总体的抽奖概率判断该用户是否中奖<br/>
2.如果中奖的话,则随机从所有奖品里面抽出一个<br/>
3.所有奖品抽完后中奖概率变成0<br/>
如:中奖概率为20%,一等奖1个,二等奖2个,三等奖3个;<br/>
首先判断是否中奖,中奖概率为20%<br/>
中奖的客户再判断中哪个奖项,一等奖的概率:1/(1+2+3);二等奖概率:2/(1+2+3);三等奖概率:3/(1+2+3);<br/>
每次中某个奖品后,相应的奖品数量需要-1,如中出一个三等奖后,相应的中奖概率:一等奖的概率:1/(1+2+2);二等奖概率:2/(1+2+2);三等奖概率:2/(1+2+2);
某个奖品数量抽完后,该奖品中奖概率变成0,如一等奖抽完后,一等奖中奖概率:0/(0+2+3)
全部奖品抽空后,不能再中奖
private function getAwardresult($award) { if (empty($award)) { return false; } //总的奖项目 $i = count($award); $prob_sum = 0; foreach($award as $item){ $prob_sum += $item['size']; } //总的概率 $award_chance = 20; $rand = mt_rand(1, 10000); //1-10000之间随机取值 $award_chance *= 100; //0.01-100.00的概率 if ($rand <= $award_chance) { $level = mt_rand(1, $i); //中了几等奖 1 一号奖品,2 二号奖品,3 三号奖品,4 四号奖品,5 五号奖品 $num = $award[$i]/$prob_sum; if($num>0){ return $level; } return false; } return false; }
算法二(单独概率计算)<br/>
此类营销活动奖品中奖概率可以单独设置,每次仅需要判断是否中奖不需要二次确认中什么奖品
中奖判断:
根据设置的中奖概率,判断该次抽奖是否中奖,中了什么奖品<br/>
如果某奖品已经是小于等于0,那么这个奖品的获得概率合并到不中奖概率<br/>
所有奖品抽完后,不能继续中奖<br/>
如:一等奖中奖概率为1%,奖品10个,二等奖2%,奖品10个,三等奖3%,奖品20个<br/>
只要一二三等奖奖品没抽空的情况下,不管已经抽出去了多少个一二三等奖,抽中一二三等奖的概率都不变,分别为;1%.2%,3%;
如果一等奖已经抽完了,用户还是抽到1-100中的数字,此时用户并没有中一等奖,因为奖品数量是0,所以还是不中奖
假如数组如下:
$award = array(
'0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),
'1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
'2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),
'3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),
'4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
'5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
);
//抽奖结果,概率计算 private function getAwardresult($award,$id) { if (empty($award)) { return false; } //总的概率 $award_chance = 0; for ($i = 0; $i < count($award); $i++) { $award_chance += $award[$i]['award_chance']; } if ($award_chance <= 0) { return false; } $rand = mt_rand(1, 10000); //1-10000之间随机取值 $award_chance *= 100; //0.01-100.00的概率 if ($rand <= $award_chance) { $level = mt_rand(1, $i); //中了几等奖 1 一号奖品,2 二号奖品,3 三号奖品,4 四号奖品,5 五号奖品 /* //如果总概率不是100%,就小小的控制一下,这样相当对每一号奖并发起到了控制 $key = "shake_lock_level_award_{$id}:{$level}"; if ($award_chance != 10000 && !Redis::getInstance()->setNx($key, 1, 3)) { return false; } */ return $level; } return false; }
算法二是一段比较经典的概率算法,$award是一个预先设置的数组,v表示中奖概率大小是0-100,开始是从,10000这个概率范围内筛选一个数是否在他的出现概率范围之内, 如果在,说明中奖,再在总共的奖项中筛选一个数,看中了几等奖,当然还有去判断处理看看该奖项是否还有剩余
原文地址:https://www.cnblogs.com/jxxiaocao/p/12583713.html
- Selenium2+python自动化55-unittest之装饰器(@classmethod)
- 每天一个Linux命令(4)——mkdir
- 每天一个Linux命令(3)——pwd
- 11-移动端开发教程-zepto.js入门教程
- 【OpenCV学习笔记之一】图像加载,修改及保存
- 【干货】一种直观的方法认识梯度下降
- 漫谈Java IO之普通IO流与BIO服务器
- 浅谈强化学习的方法及学习路线
- 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略
- Fiddler抓包7-post请求(json)
- Selenium2+python自动化56-unittest之断言(assert)
- 长文 | 手把手教你如何使用python进行数据分析(最好将文章代码自己码一遍)
- 回归与梯度下降法及实现原理
- 【宅男宅女们的福音】电影天堂最新电影爬取及搜索脚本
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 几道暑期实习笔试题
- Java自动化测试(selenium 22)
- linux 实现双网卡绑定单个IP——team篇
- Eclipse华丽转身之控件表格工厂
- 面试常考知识点总结——面试必看
- linux 实现双网卡绑定单个IP——bond篇
- Hacking with iOS: SwiftUI Edition - 愿望清单项目(一)
- 重拾Java Web应用的基础体系结构
- 使用SAP C4C自定义BO实现自定义的Number Range
- 限流算法简介及Guava RateLimiter令牌桶限流介绍
- K8S的名称空间创建&&版本的升级、回滚操作
- SAP Cloud for Customer CLR(Code List Restriction)的一种高级用法
- SAP WebClient UI One Hit Navigation的实现方法
- 【打包构建】Mac下使用expect实现执行sudo命令时自动输入密码
- ASP.NET Core 奇淫技巧之SPA部署