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 相关文章推荐
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
php读取大文件示例分享(文件操作类)
Apr 13 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
PHPUnit安装及使用示例
Oct 29 PHP
php支持断点续传、分块下载的类
May 02 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
PHP 99乘法表的几种实现代码
Oct 13 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
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
PHP中cookie知识点学习
2018/05/06 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
python处理PHP数组文本文件实例
2014/09/18 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
python3.5绘制随机漫步图
2018/08/27 Python
pycham查看程序执行的时间方法
2018/11/29 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
省文明单位申报材料
2014/05/08 职场文书
导师就业推荐信范文
2014/05/22 职场文书
门面房租房协议书
2014/08/20 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书