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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM