好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

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

<?php  /**    *     *    * @lanfengye <zibin_5257@163测试数据>    */   class  ChoujiangAction  extends  Action {        //抽奖的开始时间        //开源代码phpfensi测试数据        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 empty ( $qq_no )){               $this ->ajaxReturn(1,  '请正确填写QQ号码!' );               exit ;          }                       if (! empty empty ( $this ->begin_time) && time()< strtotime ( $this ->begin_time)){               $this ->ajaxReturn(1,  '抽奖还没有开始,开始时间为:' . $this ->begin_time);               exit ;          }                       if (! empty 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高级应用的详细内容...

  阅读:36次