• 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");
  • 相关阅读:
    git切换分支报错解决
    网上看到的一个布局神器
    js获取滚动条,文档,浏览器高度
    使用iView-cli创建一个pc端网页(1)
    ajax详解与用途
    JavaScript中for/in和for的区别
    排序
    Java中getResourceAsStream的用法
    java程序打包成exe的总结
    使用7zip把jre集成到绿色运行程序内
  • 原文地址:https://www.cnblogs.com/e0yu/p/7839477.html
Copyright © 2020-2023  润新知