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中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
PHP 变量类型的强制转换
Oct 23 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
php获取$_POST同名参数数组的实现介绍
Jun 30 PHP
php四种基础算法代码实例
Oct 29 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
PHP简单的MVC框架实现方法
Dec 01 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 PHP
PHP序列化和反序列化深度剖析实例讲解
Dec 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中的cookie不用刷新就生效的方法
2012/02/04 PHP
基于PHP文件操作的详解
2013/06/05 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
Python判断文件和文件夹是否存在的方法
2015/05/21 Python
python追加元素到列表的方法
2015/07/28 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
Python切片操作深入详解
2018/07/27 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
python3实现高效的端口扫描
2019/08/31 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
Python3常见函数range()用法详解
2019/12/30 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
仓库理货员岗位职责
2013/12/18 职场文书
企事业单位求职者的自我评价
2013/12/28 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
运动会广播稿200字
2014/10/18 职场文书
见习报告的格式
2014/10/31 职场文书
Apache POI的基本使用详解
2021/11/07 Servers