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 相关文章推荐
基于mysql的bbs设计(五)
Oct 09 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
Oct 30 PHP
PHP进程同步代码实例
Feb 12 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
PHP中关键字interface和implements详解
Jun 14 PHP
laravel 错误处理,接口错误返回json代码
Oct 25 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 PHP
PHPstorm激活码2020年5月13日亲测有效
Sep 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采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
js 自动播放的实例代码
2013/11/19 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
react路由配置方式详解
2017/08/07 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
python标准库os库的函数介绍
2020/02/12 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
python中str内置函数用法总结
2020/12/27 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
大四自我鉴定
2014/02/08 职场文书
运动会稿件100字
2014/02/21 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
设计顾问服务计划书
2014/05/04 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
党员个人整改措施
2014/10/24 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers