PHP概率抽獎

get_rand 方法是一段經典的概率算法,$proArr是一個預先設置的數組,例如數組為:array(1=>5,2=>10,3=>10,4=>20,5=>25,6=>30),鍵對應的是中獎等級,值對應中獎概率,開始從1,100這個概率範圍內篩選第一個數是否在它的出現概率範圍之內,如果不在,剛將概率空間範圍收縮,在本例當中就是減去5,也就是說第二個數在1,95這個範圍內篩選的。以此類推,這樣篩選到最終,總會有一個數滿足要求。這個算法裝簡單。到最終抽到數據在概率範圍內時,就將等級id返回。

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; 
    
    } 

/*上面是獲取抽獎等級結果的方法,那麼在下面這裏設置一下中獎相關數據,以數組的形式表示,
  *id   中獎id
  *v    中獎概率
  *p    中獎獎品
  *注:所配置概率值必需為整數
  */

$prize_arr = array( 
        array('id'=>1,'v'=>5, 'p'=>'一等獎'), 
        array('id'=>2,'v'=>10,'p'=>'二等獎'), 
        array('id'=>3,'v'=>10,'p'=>'三等獎'), 
        array('id'=>4,'v'=>20,'p'=>'四等獎'), 
        array('id'=>5,'v'=>25,'p'=>'優秀獎'), 
        array('id'=>6,'v'=>30,'p'=>'安慰獎'), 
    ); 

/*
  *獎項相關數據設置完畢之後,接下來我們要做的就是要將中獎的數組數據重組生成:等級id=>等級對的應概率,這種方式交給get_rand方法去獲取得最終中獎的等級id
*/

$rand_arr = array();
foreach ($prize_arr as $key => $val) { 
    $rand_arr[$val['id']] = $val['v']; 
}
$rval = get_rand($rand_arr); //根據概率獲取中獎的等級id

//最後獲取得到$rval這個就是中獎的等級id,根據這個id,我們就可以處理獎項數據

$lucky = $unlucky = array();
foreach($prize_arr as $key=>$val){
    if($val['id']==$rval){
        $lucky = $val;
    }else{
        $unlucky[] = $val;
    }
}

/*到了這裏,中獎的信息與沒有中獎的信息已經分開兩數組存放,。到最後就是處理結果,這裏簡單處理一下,看一下效果。到此,php處理的抽獎信息部分已經完成,至於其它的相關聯的處理操作,例如如果異步js的操作,這些不在此列出**/

echo '恭喜你獲得:'.$lucky['p'];

 

posted @ 2013-04-30 14:28  Vhelin  阅读(173)  评论(0编辑  收藏  举报