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 相关文章推荐
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
PHP中文件缓存转内存缓存的方法
Dec 06 PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
关于PHP堆栈与列队的学习
Jun 21 PHP
ThinkPHP3.1.3版本新特性概述
Jun 19 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
Jan 26 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
php实现将Session写入数据库
Jul 26 PHP
php中array_column函数简单实现方法
Jul 11 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
PHP7修改的函数
Mar 09 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
php获得当前的脚本网址
2007/12/10 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
javascript 时间比较实现代码
2009/10/28 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
利用Python实现图书超期提醒
2016/08/02 Python
python中map的基本用法示例
2018/09/10 Python
python图像处理入门(一)
2019/04/04 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
python plotly画柱状图代码实例
2019/12/13 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
开学典礼策划方案
2014/05/28 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
高一军训决心书
2015/02/05 职场文书
中小企业员工手册范本
2015/05/14 职场文书
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS