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'];