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在线打包程序源码
Jul 27 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
关于svn冲突的解决方法
Jun 21 PHP
PHP @ at 记号的作用示例介绍
Oct 10 PHP
php中filter_input函数用法分析
Nov 15 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 PHP
PDO::quote讲解
Jan 29 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
详解PHP中curl_multi并发的实现
Jun 08 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生成随机密码类分享
2014/06/25 PHP
php数组查找函数总结
2014/11/18 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
js Calender控件使用详解
2015/01/05 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
Python 序列的方法总结
2016/10/18 Python
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
python实现简单的文字识别
2018/11/27 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
Django中的静态文件管理过程解析
2019/08/01 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
澳洲的服装老品牌:SABA
2018/02/06 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
实习单位证明范例
2014/11/17 职场文书
心得体会格式及范文
2016/01/25 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
新手初学Java List 接口
2021/07/07 Java/Android
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js