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;

因為樣本沒有改變,雖然可能抽取的隨機數不止一個,但是概率是不變的。

砸金蛋案例

http://www.thinkphp.cn/code/1154.html
http://demo.sucaihuo.com/17/
public function eggajax(){
    //ajax.php中獎項設置和計算中獎概率算法。
    $prize_arr = array( 
        '0' => array('id' => 1, 'title' => 'iphone5s', 'v' => 5), 
        '1' => array('id' => 2, 'title' => '聯系筆記本', 'v' => 10), 
        '2' => array('id' => 3, 'title' => '音箱設備', 'v' => 20), 
        '3' => array('id' => 4, 'title' => '30GU盤', 'v' => 30), 
        '4' => array('id' => 5, 'title' => '話費50元', 'v' => 10), 
        '5' => array('id' => 6, 'title' => 'iphone6s', 'v' => 15), 
        '6' => array('id' => 7, 'title' => '謝謝,繼續加油哦!~', 'v' => 10), 
    );
    foreach ($prize_arr as $key => $val) { 
        $arr[$val['id']] = $val['v']; 
    }
    $prize_id = $this->getRand($arr); //根據概率獲取獎品id 
    $data['msg'] = ($prize_id == 7) ? 0 : 1; //如果為0則沒中
    $data['prize_title'] = $prize_arr[$prize_id - 1]['title']; //中獎獎品
    echo json_encode($data); 
    exit; //以json數組返回給前端
}
public function getRand($proArr) { //計算中獎概率 
    $rs = ''; //z中獎結果 
    $proSum = array_sum($proArr); // 概率數組的總概率精度            
    //概率數組循環 
    foreach ($proArr as $key => $proCur) { 
        $randNum = mt_rand(1, $proSum); 
        if ($randNum <= $proCur) { 
            $rs = $key; 
            break; 
        } else { 
            $proSum -= $proCur; 
        } 
    } 
    unset($proArr); 
    return $rs; 
}

具體JS:

var ourl = "{:U('Egg/eggajax')}";
$.post(ourl,function(data){
    if(data['msg'] == 1){
        alert(data['prize_title']);
    };
},"json");

 


免責聲明!

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



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