PHP抽奖算法程序代码分享


Posted in PHP onOctober 08, 2015

抽奖算法需要满足的需求如下:
1.可以控制中奖的概率
2.具有随机性
3.最好可以控制奖品的数量
4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数
初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面看一下整体的程序:
该程序是在ThinkPHP框架下完成的,使用了一些框架自带的类库和函数,下面我会逐一进行说明,控制器部分:
代码如下

<?php
 
/**
 * 
 *
 * @lanfengye <zibin_5257@163.com>
 */
class ChoujiangAction extends Action {
   //抽奖的开始时间
  var $begin_time="2012-12-25 14:00:00"; //开始时间 0-不限制
  //抽奖的结束时间
  var $stop_time="0"; //结束时间 0-不限制
   
  //本次抽奖的奖项信息,必须按照从大到小的顺序进行填写,id为奖次,prize为中奖信息,v为中奖概率,num为奖品数量
  //需要注意的是,该处也必须包含不中奖的信息,概率从小到大进行排序
  var $prize_arr = array(
    '0' => array('id' => 1, 'prize' => '44元购买1G/年空间', 'v' => 1,'num'=>1),
    '1' => array('id' => 2, 'prize' => '55元购买1G/年空间', 'v' => 2,'num'=>2),
    '2' => array('id' => 3, 'prize' => '66元购买1G/年空间', 'v' => 5,'num'=>2),
    '3' => array('id' => 4, 'prize' => '77元购买1G/年空间', 'v' => 10,'num'=>3),
    '4' => array('id' => 5, 'prize' => '88元购买1G/年空间', 'v' => 15,'num'=>4),
    '5' => array('id' => 6, 'prize' => '99元购买1G/年空间', 'v' => 67,'num'=>10),
  );
   
 
  //首页显示方法   
  public function index(){
    //连接数据库,去获取本次中奖的人员名单
    $Choujiang=M('Choujiang');
    $this->assign('list', $Choujiang->where("rid>0")->order('id desc')->select());
    unset($Choujiang);
     
    //在首页中显示抽奖的开始时间
    $this->assign('begin_time',$this->begin_time);
     
    $this->display();
  }
   
 
   
  /**
   * 生成中奖信息,ajax进行请求该方法,需要客户填写QQ号码
   */
  public function make() {
    $qq_no= trim($_POST['qq_no']);
    import('ORG.Util.Input');
    $qq_no=Input::getVar($qq_no);
     
    if(empty($qq_no)){
      $this->ajaxReturn(1, '请正确填写QQ号码!');
      exit;
    }
     
    if(!empty($this->begin_time) && time()<strtotime($this->begin_time)){
      $this->ajaxReturn(1, '抽奖还没有开始,开始时间为:'.$this->begin_time);
      exit;
    }
     
    if(!empty($this->stop_time) && time()>strtotime($this->stop_time)){
      $this->ajaxReturn(1, '本次抽奖已经结束,结束时间为:'.$this->stop_time);
      exit;
    }
     
     //获取奖项信息数组,来源于私有成员
    $prize_arr= $this->prize_arr;
     
    foreach ($prize_arr as $key => $val) {
      $arr[$val['id']] = $val['v'];
    }
    //$rid中奖的序列号码
    $rid = $this->get_rand($arr); //根据概率获取奖项id
     
    $str = $prize_arr[$rid - 1]['prize']; //中奖项 
     
    $Choujiang=M('Choujiang');
     
      //从数据库中获取特定QQ号已经参加抽奖的次数,如果大于等于3则提示次数用完
    if($Choujiang->where("qq_no='{$qq_no}'")->count()>=3){
      $str='您3次抽奖机会已经用完!';
      $rid=0;
      //从数据库中获取特定奖项序号的次数,大于等于设置的最大次数则提示奖品被抽完,如果需要一直中最后一个纪念奖,则修改该处即可
    }elseif ($Choujiang->where("rid={$rid}")->count()>=$prize_arr[$rid-1]['num']) {
      $str='很抱歉,您所抽中的奖项已经中完!';
      $rid=0;
    }
    //生成一个用户抽奖的数据,用来记录到数据库
    $data=array(
      'rid'=>$rid,
      'pop'=>$str,
      'qq_no'=>$qq_no,
      'input_time'=>time()
    );
    //将用户抽奖信息数组写入数据库
     
    $Choujiang->add($data);
    unset($Choujiang);
     
     //ajax返回信息
    $this->ajaxReturn(1, $str);
  }
   
  /**
   * 根据概率获取中奖号码
   */
  private 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;
  }
   
}   
?>

该算法简单使用,并发访问性能非常好,稍加改动就可以用于各种场合,结合用户登录等信息可有效控制每个人的抽奖次数。将开始和结束之间更改为数组,就可以完善成为每天特定时间抽奖的程序。

希望大家可以结合有关php抽奖程序的文章进行深入学习,更好的掌握这门语言的应用技巧。

PHP 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
php中通过smtp发邮件的类,测试通过
Jan 22 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
Jul 28 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
你真的了解PHP中的引用符号(&)吗
May 12 PHP
php png失真的原因及解决办法
Nov 17 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 #PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 #PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 #PHP
php 问卷调查结果统计
Oct 08 #PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 #PHP
php开发微信支付获取用户地址
Oct 04 #PHP
浅谈使用PHP开发微信支付的流程
Oct 04 #PHP
You might like
php strtotime 函数UNIX时间戳
2009/01/14 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
js去除空格的12种实用方法
2013/11/08 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
python控制台中实现进度条功能
2015/11/10 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
如何通过python实现全排列
2020/02/11 Python
如何将json数据转换为python数据
2020/09/04 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
英国网上购买门:Direct Doors
2018/06/07 全球购物
高中生打架检讨书1000字
2015/02/17 职场文书