zoukankan      html  css  js  c++  java
  • 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");
  • 相关阅读:
    野指针防范
    Linuxgate.so.1的含义[ZZ]
    malloc hook
    用PDF补丁丁一分钟批量删除PDF文档的第一页和最后一页
    PDF 补丁丁 0.4 测试版已经上线
    生活小百科:实用的生活保健小窍门,60则!....
    Pascal Analyzer 4 代码分析使用简要说明
    大数法则
    make: *** No rule to make target `all'. Stop.
    界面动态配置:持久化反持久化
  • 原文地址:https://www.cnblogs.com/e0yu/p/7839477.html
Copyright © 2011-2022 走看看