php概率算法

這是一個很經典的概率算法函數:

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/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章