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");

 

posted @ 2017-11-15 16:05  帅到要去报警  阅读(1602)  评论(1编辑  收藏  举报