网站地图    收藏   

主页 > php专栏 > php应用 >

PHP中奖概率的抽奖算法程序代码 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

[导读] 1.可以控制中奖的概率,2.具有随机性,3.最好可以控制奖品的数量,4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法...

PHP中奖概率的抽奖算法程序代码

1.可以控制中奖的概率,2.具有随机性,3.最好可以控制奖品的数量,4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数

初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面看一下整体的程序.该程序是在ThinkPHP框架下完成的,使用了一些框架自带的类库和函数,下面我会逐一进行说明,控制器部分,代码如下:

  1. <?php 
  2. /** 
  3.  *  
  4.  * 
  5.  * @lanfengye <zibin_5257@163.com> 
  6.  */ 
  7. class ChoujiangAction extends Action { 
  8.      //抽奖的开始时间 
  9.     //开源代码phpfensi.com 
  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. ?>  

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论