本示例代碼是一段經典的機率算法,$probability是一個預先設置的數組,假設數組爲:array(10,20,30,40),
開始是從1,100這個機率範圍內篩選第一個數是否在他的出現機率範圍以內,
若是不在,則將機率空間,也就是k的值減去剛剛的那個數字的機率空間,在本例當中就是減去100,
也就是說第二個數是在1,900這個範圍內篩選的。這樣篩選到最終,總會有一個數知足要求。
就至關於去一個箱子裏摸東西,第一個不是,第二個不是,第三個還不是,那最後一個必定是。
這個算法簡單,並且效率很是高,關鍵是這個算法已在咱們之前的項目中有應用,尤爲是大數據量的項目中效率很是棒。
PHP+jQuery實現翻板抽獎Demophp
<?php /** * 機率算法 * @param array $probability * @return integer|string */ function get_rand($probability) { // 機率數組的總機率精度 $max = array_sum($probability); foreach ($probability as $key => $val) { $rand_number = mt_rand(1, $max); if ($rand_number <= $val) { return $key; } else { $max -= $val; } } } // 機率比例 /* 接下來咱們經過PHP配置獎項。 */ $data = array( array( "平板電腦","prob"=>1 ), array( "數碼相機","prob"=>3 ), array( "音箱設備","prob"=>6 ), array( "8G優盤","prob"=>20 ), array( "10Q幣","prob"=>25 ), array( "prize"=>"下次沒準就能中噢","prob"=>50 ) ); |
$data中是一個二維數組,記錄了全部本次抽獎的獎項信息,其中prize表示獎品,prob表示中獎機率。注意其中的prob必須爲整數
你能夠將對應的獎項的prob設置成0,即意味着該獎項抽中的概率是0
數組中prob的總和(基數),基數越大越能體現機率的準確性。
本例中prob的總和爲100,那麼平板電腦對應的中獎機率就是1%,若是prob的總和是1000,那中獎機率就是千分之一了。算法
<?php foreach ($data as $key=>$val) unset($data[$n]); // 將中獎項從數組中剔除,剩下未中獎項 //$res['no'] = array_map(function($x){return $x[0];}, $data); // 除了中獎外的其餘數據 echo json_encode($res);code |