php抽奖概率算法(刮刮卡,大转盘)


Posted in PHP onApril 17, 2020

本文实例为大家分享了php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法,用法很简单,代码里有详细注释说明,供大家参考,具体内容如下

<?php
/*
 * 经典的概率算法,
 * $proArr是一个预先设置的数组,
 * 假设数组为:array(100,200,300,400),
 * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内, 
 * 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,
 * 在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。
 * 这样 筛选到最终,总会有一个数满足要求。
 * 就相当于去一个箱子里摸东西,
 * 第一个不是,第二个不是,第三个还不是,那最后一个一定是。
 * 这个算法简单,而且效率非常高,
 * 这个算法在大数据量的项目中效率非常棒。
 */
function get_rand($proArr) { 
 $result = ''; 
 //概率数组的总概率精度 
 $proSum = array_sum($proArr); 
 //概率数组循环 
 foreach ($proArr as $key => $proCur) { 
  $randNum = mt_rand(1, $proSum); 
  if ($randNum <= $proCur) { 
   $result = $key; 
   break; 
  } else { 
   $proSum -= $proCur; 
  }  
 } 
 unset ($proArr); 
 return $result; 
} 
 
 
/*
 * 奖项数组
 * 是一个二维数组,记录了所有本次抽奖的奖项信息,
 * 其中id表示中奖等级,prize表示奖品,v表示中奖概率。
 * 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0,
 * 数组中v的总和(基数),基数越大越能体现概率的准确性。
 * 本例中v的总和为100,那么平板电脑对应的 中奖概率就是1%,
 * 如果v的总和是10000,那中奖概率就是万分之一了。
 * 
 */
$prize_arr = 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), 
); 
 
/*
 * 每次前端页面的请求,PHP循环奖项设置数组,
 * 通过概率计算函数get_rand获取抽中的奖项id。
 * 将中奖奖品保存在数组$res['yes']中,
 * 而剩下的未中奖的信息保存在$res['no']中,
 * 最后输出json个数数据给前端页面。
 */
foreach ($prize_arr as $key => $val) { 
 $arr[$val['id']] = $val['v']; 
} 
$rid = get_rand($arr); //根据概率获取奖项id 
 
$res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项 
unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项 
shuffle($prize_arr); //打乱数组顺序 
for($i=0;$i<count($prize_arr);$i++){ 
 $pr[] = $prize_arr[$i]['prize']; 
} 
$res['no'] = $pr; 
print_r($res); 
?>

想要学习更多关于抽奖功能的实现,请参考此专题:抽奖功能

以上就是php抽奖概率算法的全部内容,希望对大家学习php程序设计有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php网页后退不再出现过期
Mar 08 PHP
PHP array 的加法操作代码
Jul 24 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
Apr 23 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
刷新PHP缓冲区为你的站点加速
Oct 10 PHP
为何说PHP引用是个坑,要慎用
Apr 02 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
PHP页面静态化――纯静态与伪静态用法详解
Jun 05 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 #PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 #PHP
PHP生成静态HTML文档实现代码
Jun 23 #PHP
PHP微信支付开发实例
Jun 22 #PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 #PHP
PHP树-不需要递归的实现方法
Jun 21 #PHP
PHP MySql增删改查的简单实例
Jun 21 #PHP
You might like
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
javascript比较文档位置
2008/04/08 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
python基于Selenium的web自动化框架
2019/07/14 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
社团活动策划书范文
2014/01/09 职场文书
网页美工求职信
2014/02/15 职场文书
工程质量承诺书
2014/03/27 职场文书
房产买卖委托公证书
2014/04/04 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server