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 相关文章推荐
漂亮但不安全的CTB
Oct 09 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
May 05 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
PHP设置Cookie的HTTPONLY属性方法
Feb 09 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 PHP
php经典趣味算法实例代码
Jan 21 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的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
python读写json文件的简单实现
2017/04/11 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
python生成器与迭代器详解
2019/01/01 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python装饰器使用实例详解
2019/12/14 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
意大利文具和办公产品在线商店:Y-Office
2020/02/27 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
我们的节日端午节活动方案
2014/03/02 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
投资入股合作协议书
2014/10/28 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
刮痧观后感
2015/06/05 职场文书
四则混合运算教学反思
2016/02/23 职场文书
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android