熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP中獎概率的抽獎算法程序代碼

2013-11-15 12:34:06  來源: PHP編程 

  初期就這些需求然後根據網上的資料采用了一種階段式抽取的方法大家下面看一下整體的程序 該程序是在ThinkPHP框架下完成的使用了一些框架自帶的類庫和函數下面我會逐一進行說明控制器部分

 

  抽獎算法需要滿足的需求如下

  可以控制中獎的概率

  具有隨機性

  最好可以控制獎品的數量

  根據用戶ID或者ip手機號QQ號等條件限制抽獎次數

  
初期就這些需求然後根據網上的資料采用了一種階段式抽取的方法大家下面看一下整體的程序

  該程序是在ThinkPHP框架下完成的使用了一些框架自帶的類庫和函數下面我會逐一進行說明控制器部分

 代碼如下   <?php
  
/**
 * 
 *
 * @lanfengye <zibin_@com>
 */
class ChoujiangAction extends Action {
     //抽獎的開始時間
    var $begin_time=" ::"; //開始時間  不限制
    //抽獎的結束時間
    var $stop_time="";  //結束時間  不限制
      
    //本次抽獎的獎項信息必須按照從大到小的順序進行填寫id為獎次prize為中獎信息v為中獎概率num為獎品數量
    //需要注意的是該處也必須包含不中獎的信息概率從小到大進行排序
    var $prize_arr = array(
        => array(id => prize => 元購買G/年空間 v => num=>)
        => array(id => prize => 元購買G/年空間 v => num=>)
        => array(id => prize => 元購買G/年空間 v => num=>)
        => array(id => prize => 元購買G/年空間 v => num=>)
        => array(id => prize => 元購買G/年空間 v => num=>)
        => array(id => prize => 元購買G/年空間 v => num=>)
    );
     
 
    //首頁顯示方法     
    public function index(){
        //連接數據庫去獲取本次中獎的人員名單
        $Choujiang=M(Choujiang);
        $this>assign(list $Choujiang>where("rid>")>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(ORGUtilInput);
        $qq_no=Input::getVar($qq_no);
          
        if(empty($qq_no)){
            $this>ajaxReturn( 請正確填寫QQ號碼!);
            exit;
        }
          
        if(!empty($this>begin_time) && time()<strtotime($this>begin_time)){
            $this>ajaxReturn( 抽獎還沒有開始開始時間為$this>begin_time);
            exit;
        }
          
        if(!empty($this>stop_time) && time()>strtotime($this>stop_time)){
            $this>ajaxReturn( 本次抽獎已經結束結束時間為$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 ][prize]; //中獎項 
          
        $Choujiang=M(Choujiang);
          
            //從數據庫中獲取特定QQ號已經參加抽獎的次數如果大於等於則提示次數用完
        if($Choujiang>where("qq_no={$qq_no}")>count()>=){
            $str=次抽獎機會已經用完!;
            $rid=;
            //從數據庫中獲取特定獎項序號的次數大於等於設置的最大次數則提示獎品被抽完如果需要一直中最後一個紀念獎則修改該處即可
        }elseif ($Choujiang>where("rid={$rid}")>count()>=$prize_arr[$rid][num]) {
            $str=很抱歉您所抽中的獎項已經中完!;
            $rid=;
        }
        //生成一個用戶抽獎的數據用來記錄到數據庫
        $data=array(
            rid=>$rid
            pop=>$str
            qq_no=>$qq_no
            input_time=>time()
        );
        //將用戶抽獎信息數組寫入數據庫
          
        $Choujiang>add($data);
        unset($Choujiang);
          
         //ajax返回信息
        $this>ajaxReturn( $str);
    }
      
    /**
     * 根據概率獲取中獎號碼
     */
    private function get_rand($proArr) {
        $result = ;
        //概率數組的總概率精度 
        $proSum = array_sum($proArr);
        //概率數組循環 
        foreach ($proArr as $key => $proCur) {
            $randNum = mt_rand( $proSum);
            if ($randNum <= $proCur) {
                $result = $key;
                break;
            } else {
                $proSum = $proCur;
            }
        }
        unset($proArr);
        return $result;
    }
      
}
  
  
  
?>

  該算法簡單使用並發訪問性能非常好稍加改動就可以用於各種場合結合用戶登錄等信息可有效控制每個人的抽獎次數將開始和結束之間更改為數組就可以完善成為每天特定時間抽獎的程序


From:http://tw.wingwit.com/Article/program/PHP/201311/21193.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.