PHP幾個常用的概率演算法

2022-09-16 00:21:21 字數 2101 閱讀 1324

演算法一

/**

* 全概率計算

* * @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4)

* @return string 返回上面陣列的key

*/function random($ps)

}return $arr[$key][mt_rand(0,count($arr[$key])-1)];

}

演算法二

function get_rand($proarr)  else 

}unset ($proarr);

return $result;

}

演算法二是一段經典的概率演算法,$proarr是乙個預先設定的陣列,假設陣列為:array(100,200,300,400),開始是從1,1000這個概率範圍內篩選第乙個數是否在他的出現概率範圍之內, 如果不在,則將概率空減,也就是k的值減去剛剛的那個數字的概率空間,在本例當中就是減去100,也就是說第二個數是在1,900這個範圍內篩選的。這樣篩選到最終,總會有乙個數滿足要求。就相當於去乙個箱子裡摸東西,第乙個不是,第二個不是,第三個還不是,那最後乙個一定是。這個演算法簡單,而且效率非常高,關鍵是這個演算法已在我們以前的專案中有應用,尤其是大資料量的專案中效率非常棒。

接下來我們通過php配置獎項。

$prize_arr = array(

'0' => array('id'=>1,'prize'=>'平板電腦','v'=>1),

'1' => array('id'=>2,'prize'=>'數位相機','v'=>5),

'2' => array('id'=>3,'prize'=>'音箱裝置','v'=>10),

'3' => array('id'=>4,'prize'=>'4g優盤','v'=>12),

'4' => array('id'=>5,'prize'=>'10q幣','v'=>22),

'5' => array('id'=>6,'prize'=>'下次沒準就能中哦','v'=>50),

);

$prize_arr是乙個二維陣列,記錄了所有本次**的獎項資訊,其中id表示中獎等級,prize表示獎品,v表示中獎概率。注意其中的v必須為整數,你可以將對應的獎項的v設定成0,即意味著該獎項抽中的機率是0,陣列中v的總和(基數),基數越大越能體現概率的準確性。本例中v的總和為100,那麼平板電腦對應的中獎概率就是1%,如果v的總和是10000,那中獎概率就是萬分之一了。

每次前端頁面的請求,php迴圈獎項設定陣列,通過概率計算函式get_rand獲取抽中的獎項id。將中獎獎品儲存在陣列$res['yes']中,而剩下的未中獎的資訊儲存在$res['no']中,最後輸出json個數資料給前端頁面。

//如果中獎資料是放在資料庫裡,這裡就需要進行判斷中獎數量

//在中1、2、3等獎的,如果達到最大數量的則unset相應的獎項,避免重複中大獎

//code here eg:unset($prize_arr['0'])

foreach ($prize_arr as $key => $val)

$rid = get_rand($arr); //根據概率獲取獎項id

$res['yes'] = $prize_arr[$rid-1]['prize']; //中獎項

//將中獎項從陣列中剔除,剩下未中獎項,如果是資料庫驗證,這裡可以省掉

unset($prize_arr[$rid-1]);

shuffle($prize_arr); //打亂陣列順序

for($i=0;$i為什麼總是抽不到大獎呢?

在很多類似的**活動中,參與者往往抽不到大獎,筆者從程式的角度舉個例給你看,假如我是**活動的主辦方,我設定了6個獎項,每個獎項不同的中獎概率,假如一等獎是一台高階轎車,可是我設定了其中獎概率為0,這意味著什麼?這意味著參與**者無論怎麼抽,永遠也得不到這台高階轎車。而當主辦方每次翻動剩下的方塊時,參與者會發現一等獎也許就在剛剛**的方塊旁邊的乙個數字下,都怪自己運氣差。真的是運氣差嗎?其實在參與者翻動那個方塊時程式已經決定了中獎項,而翻動檢視其他方塊看到的獎項只是乙個煙霧彈,迷惑了觀眾和參與者。我想看完這篇文章後,您或許會知道電視節目中的翻板**貓膩了,您也許大概再不會去機選雙色球了。

php概率計算 PHP指定概率演算法

php指定概率演算法,可用於刮刮卡,大轉盤等 演算法。假設 有乙個二維陣列,記錄了所有本次 的獎項資訊 test arr array a 20,b 30,c 50 a獎概率20 b獎概率30 c獎概率50 模擬函式執行過程 總概率精度為20 30 50 100 第一次陣列迴圈,procur 20 假...

php概率計算 php 中獎概率演算法

上次專案中有個 活動,中獎概率演算法整理成一篇筆記 中獎概率演算法 v表示中獎概率,注意其中的v必須為整數,可以將對應的獎項的v設定成0,即意味著該獎項抽中的機率是0,陣列中v的總和 基數 基數越大越能體現概率的準確性。本例中v的總和為100,那麼 特等獎 對應的中獎概率就是1 如果v的總和是100...

PHP指定概率演算法

php指定概率演算法,可用於刮刮卡,大轉盤等 演算法。假設 有乙個二維陣列,記錄了所有本次 的獎項資訊 test arr array a 20,b 30,c 50 a獎概率20 b獎概率30 c獎概率50 模擬函式執行過程 總概率精度為20 30 50 100 第一次陣列迴圈,procur 20 假...