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 相关文章推荐
global.php
Dec 09 PHP
收集的php编写大型网站问题集
Mar 06 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
很让人受教的 提高php代码质量36计
Sep 05 PHP
微信支付开发教程(一)微信支付URL配置
May 28 PHP
php中opendir函数用法实例
Nov 15 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
PHP插件PHPMailer发送邮件功能
Feb 28 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 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 GD绘制24小时柱状图
2008/06/28 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
js实现简易计算器功能
2019/10/18 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
python中操作文件的模块的方法总结
2021/02/04 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
什么是方法的重载
2013/06/24 面试题
见习期自我鉴定
2014/01/31 职场文书
党支部换届选举方案
2014/05/08 职场文书
公司任命书范本
2014/06/04 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
Redis唯一ID生成器的实现
2022/07/07 Redis