php编写的抽奖程序中奖概率算法


Posted in PHP onMay 14, 2015

们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及对应的中奖概率,当前端页面点击翻动某个方块时会想后台PHP发送ajax请求,那么后台PHP根据配置的概率,通过概率算法给出中奖结果,同时将未中奖的奖项信息一并以JSON数据格式发送给前端页面。

先来看概率计算函数

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; 
}

上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。

接下来我们通过PHP配置奖项。

$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), 
);

该二维数组,记录了所有本次抽奖的奖项信息,其中id表示中奖等级,prize表示奖品,v表示中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一了。

每次前端页面的请求,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; 
 echo json_encode($res);

另附上一个网友的实现方法

/**
  * 抽奖
  * @param int $total
  */
  function getReward($total=1000)
  {
  $win1 = floor((0.12*$total)/100);
  $win2 = floor((3*$total)/100);
  $win3 = floor((12*$total)/100);
  $other = $total-$win1-$win2-$win3;
  $return = array();
  for ($i=0;$i<$win1;$i++)
  {
  $return[] = 1;
  }
  for ($j=0;$j<$win2;$j++)
  {
  $return[] = 2;
  }
  for ($m=0;$m<$win3;$m++)
  {
  $return[] = 3;
  }
  for ($n=0;$n<$other;$n++)
  {
  $return[] = '谢谢惠顾';
  }
  shuffle($return);
  return $return[array_rand($return)];
  }
  $data = getReward();
  echo $data;
  ?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
一个改进的UBB类
Oct 09 PHP
php上传文件的增强函数
Jul 21 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
Destoon实现多表查询示例
Aug 21 PHP
php判断文件上传类型及过滤不安全数据的方法
Dec 17 PHP
php防止sql注入简单分析
Mar 18 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
深入浅出php socket编程
May 13 #PHP
PHP中的traits简单使用实例
May 13 #PHP
PHP中的traits实现代码复用使用实例
May 13 #PHP
浅谈本地WAMP环境的搭建
May 13 #PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 #PHP
简单解决新浪SAE无法上传文件的问题
May 13 #PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 #PHP
You might like
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
利用javascript查看html源文件
2006/11/08 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
angularJS开发注意事项
2018/05/26 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
Django权限控制的使用
2021/01/07 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
学生处主任岗位职责
2013/12/01 职场文书
怎样写好自我鉴定
2013/12/04 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers