標籤:
這是一個很經典的機率演算法函數:
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; }
假設:我們有這樣一個數組:a獎機率20%,b獎機率30%,c獎機率50%
$prize_arr =array(‘a‘=>20,‘b‘=>30,‘c‘=>50);
類比函數執行過程:
總機率精度為20+30+50=100
第一次數組迴圈,$procur=20
假設抽取的隨機數rand(1,100),假設抽到$randNum=55
if判斷-------
如果$randNum<=20,則result=a
否則進入下一迴圈,總機率精度變為100-20=80
第二次數組迴圈,$procur=30
假設抽取的隨機數rand(1,80),假設抽到$randNum=33
if判斷---------
如果$randNum<=30,則result=b
否則進入下一迴圈,總機率精度變為80-30=50
第三次數組迴圈,$prosur=50;
假設抽取的隨機數rand(1,50),不管怎麼抽,隨機數都會<或=50,
那麼得出result=c;
因為樣本沒有改變,雖然可能抽取的隨機數不止一個,但是機率是不變的。
或者也可以這樣:
function get_rand($arr) { $pro_sum=array_sum($arr); $rand_num=mt_rand(1,$pro_sum); $tmp_num=0; foreach($arr as $k=>$val) { if($rand_num<=$val+$tmp_num) { $n=$k; break; }else { $tmp_num+=$val; } } return $n; }
http://denghai260.blog.163.com/blog/static/7268640920128244332285/
php機率演算法