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中防止伪造跨站请求的小招式
Sep 02 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
php采集中国代理服务器网的方法
Jun 16 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
Feb 28 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
php屏蔽错误及提示的方法
May 10 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
May 29 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 图像处理组件的常用函数总结
2010/04/28 PHP
解析PHP 5.5 新特性
2013/07/02 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
js控制table合并具体实现
2014/02/20 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
python抓取网页中的图片示例
2014/02/28 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
python 模拟登陆github的示例
2020/12/04 Python
Python之Sklearn使用入门教程
2021/02/19 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
工资收入证明样本(5篇)
2014/09/16 职场文书
老公婚前保证书
2015/02/28 职场文书
论文答辩开场白大全
2015/05/27 职场文书
投诉信格式范文
2015/07/02 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle