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 相关文章推荐
杏林同学录(四)
Oct 09 PHP
php抓即时股票信息
Oct 09 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
深入解析phpCB批量转换的代码示例
Jun 27 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
PHP高手需要要掌握的知识点
Aug 21 PHP
thinkphp文件引用与分支结构用法实例
Nov 26 PHP
PHP中Http协议post请求参数
Nov 02 PHP
php文件上传的两种实现方法
Apr 04 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
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中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Python程序退出方式小结
2017/12/09 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
监理员的岗位职责
2013/11/13 职场文书
团日活动策划书
2014/02/01 职场文书
知识竞赛活动方案
2014/02/18 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
公司员工体检通知
2015/04/21 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android