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 相关文章推荐
3.从实例开始
Oct 09 PHP
URL Rewrite的设置方法
Jan 02 PHP
php 文件缓存函数
Oct 08 PHP
打造超酷的PHP数据饼图效果实现代码
Nov 23 PHP
php使用curl获取https请求的方法
Feb 11 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
PHP数据库处理封装类实例
Dec 24 PHP
PHP支付宝当面付2.0代码
Dec 21 PHP
php扩展开发入门demo示例
Sep 23 PHP
php集成开发环境详解
Sep 24 PHP
PHP实现简单登录界面
Oct 23 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
图书管理程序(三)
2006/10/09 PHP
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中特殊函数集锦
2015/07/27 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
python Pygame的具体使用讲解
2017/11/03 Python
Python中类的初始化特殊方法
2017/12/01 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
Django 解决由save方法引发的错误
2020/05/21 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
感恩老师演讲稿400字
2014/08/28 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
家长高考寄语
2015/02/27 职场文书
结婚主持人致辞
2015/07/28 职场文书
高三化学教学反思
2016/02/22 职场文书
《社戏》教学反思
2016/02/22 职场文书
nginx静态资源的服务器配置方法
2022/07/07 Servers