当前位置:首页 > PHP教程 > php应用 > 列表

PHP抽奖算法程序代码分享

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-19 23:38:16 浏览: 评论:0 

这篇文章主要分享了PHP抽奖算法程序设计,抽奖在日常生活中大家都会接触到,用php如何实现抽奖算法,需要了解的朋友可以参考一下。

抽奖算法需要满足的需求如下:

1.可以控制中奖的概率

2.具有随机性

3.最好可以控制奖品的数量

4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数

初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面看一下整体的程序:

该程序是在ThinkPHP框架下完成的,使用了一些框架自带的类库和函数,下面我会逐一进行说明,控制器部分:

  1. <?php 
  2.    
  3. /** 
  4.  *  
  5.  * 
  6.  * @lanfengye <zibin_5257@163.com> 
  7.  */ 
  8. class ChoujiangAction extends Action { 
  9.    //抽奖的开始时间 
  10.   var $begin_time="2012-12-25 14:00:00"//开始时间 0-不限制 
  11.   //抽奖的结束时间 
  12.   var $stop_time="0"//结束时间 0-不限制 
  13.      
  14.   //本次抽奖的奖项信息,必须按照从大到小的顺序进行填写,id为奖次,prize为中奖信息,v为中奖概率,num为奖品数量 
  15.   //需要注意的是,该处也必须包含不中奖的信息,概率从小到大进行排序 
  16.   var $prize_arr = array
  17.     '0' => array('id' => 1, 'prize' => '44元购买1G/年空间''v' => 1,'num'=>1), 
  18.     '1' => array('id' => 2, 'prize' => '55元购买1G/年空间''v' => 2,'num'=>2), 
  19.     '2' => array('id' => 3, 'prize' => '66元购买1G/年空间''v' => 5,'num'=>2), 
  20.     '3' => array('id' => 4, 'prize' => '77元购买1G/年空间''v' => 10,'num'=>3), 
  21.     '4' => array('id' => 5, 'prize' => '88元购买1G/年空间''v' => 15,'num'=>4), 
  22.     '5' => array('id' => 6, 'prize' => '99元购买1G/年空间''v' => 67,'num'=>10), 
  23.   ); 
  24.      
  25.    
  26.   //首页显示方法    
  27.   public function index(){ 
  28.     //连接数据库,去获取本次中奖的人员名单 
  29.     $Choujiang=M('Choujiang'); 
  30.     $this->assign('list'$Choujiang->where("rid>0")->order('id desc')->select()); 
  31.     unset($Choujiang); 
  32.        
  33.     //在首页中显示抽奖的开始时间 
  34.     $this->assign('begin_time',$this->begin_time); 
  35.        
  36.     $this->display(); 
  37.   } 
  38.      
  39.    
  40.      
  41.   /** 
  42.    * 生成中奖信息,ajax进行请求该方法,需要客户填写QQ号码 
  43.    */ 
  44.   public function make() { 
  45.     $qq_no= trim($_POST['qq_no']); 
  46.     import('ORG.Util.Input'); 
  47.     $qq_no=Input::getVar($qq_no); 
  48.        
  49.     if(emptyempty($qq_no)){ 
  50.       $this->ajaxReturn(1, '请正确填写QQ号码!'); 
  51.       exit
  52.     } 
  53.        
  54.     if(!emptyempty($this->begin_time) && time()<strtotime($this->begin_time)){ 
  55.       $this->ajaxReturn(1, '抽奖还没有开始,开始时间为:'.$this->begin_time); 
  56.       exit
  57.     } 
  58.        
  59.     if(!emptyempty($this->stop_time) && time()>strtotime($this->stop_time)){ 
  60.       $this->ajaxReturn(1, '本次抽奖已经结束,结束时间为:'.$this->stop_time); 
  61.       exit
  62.     } 
  63.        
  64.      //获取奖项信息数组,来源于私有成员 
  65.     $prize_arr$this->prize_arr; 
  66.        
  67.     foreach ($prize_arr as $key => $val) { 
  68.       $arr[$val['id']] = $val['v']; 
  69.     } 
  70.     //$rid中奖的序列号码 
  71.     $rid = $this->get_rand($arr); //根据概率获取奖项id 
  72.        
  73.     $str = $prize_arr[$rid - 1]['prize']; //中奖项  
  74.        
  75.     $Choujiang=M('Choujiang'); 
  76.        
  77.       //从数据库中获取特定QQ号已经参加抽奖的次数,如果大于等于3则提示次数用完 
  78.     if($Choujiang->where("qq_no='{$qq_no}'")->count()>=3){ 
  79.       $str='您3次抽奖机会已经用完!'
  80.       $rid=0; 
  81.       //从数据库中获取特定奖项序号的次数,大于等于设置的最大次数则提示奖品被抽完,如果需要一直中最后一个纪念奖,则修改该处即可 
  82.     }elseif ($Choujiang->where("rid={$rid}")->count()>=$prize_arr[$rid-1]['num']) { 
  83.       $str='很抱歉,您所抽中的奖项已经中完!'
  84.       $rid=0; 
  85.     } 
  86.     //生成一个用户抽奖的数据,用来记录到数据库 
  87.     $data=array
  88.       'rid'=>$rid
  89.       'pop'=>$str
  90.       'qq_no'=>$qq_no
  91.       'input_time'=>time() 
  92.     ); 
  93.     //将用户抽奖信息数组写入数据库 
  94.        
  95.     $Choujiang->add($data); 
  96.     unset($Choujiang); 
  97.        
  98.      //ajax返回信息 
  99.     $this->ajaxReturn(1, $str); 
  100.   } 
  101.      
  102.   /** 
  103.    * 根据概率获取中奖号码 
  104.    */ 
  105.   private function get_rand($proArr) { 
  106.     $result = ''
  107.     //概率数组的总概率精度  
  108.     $proSum = array_sum($proArr); 
  109.     //概率数组循环  
  110.     foreach ($proArr as $key => $proCur) { 
  111.       $randNum = mt_rand(1, $proSum); 
  112.       if ($randNum <= $proCur) { 
  113.         $result = $key
  114.         break
  115.       } else { 
  116.         $proSum -= $proCur
  117.       } 
  118.     } 
  119.     unset($proArr); 
  120.     return $result
  121.   } 
  122.      
  123. }    
  124. ?> 

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

Tags: PHP抽奖算法

分享到: