• PHP概率抽獎


    get_rand 方法是一段經典的概率算法,$proArr是一個預先設置的數組,例如數組為:array(1=>5,2=>10,3=>10,4=>20,5=>25,6=>30),鍵對應的是中獎等級,值對應中獎概率,開始從1,100這個概率範圍內篩選第一個數是否在它的出現概率範圍之內,如果不在,剛將概率空間範圍收縮,在本例當中就是減去5,也就是說第二個數在1,95這個範圍內篩選的。以此類推,這樣篩選到最終,總會有一個數滿足要求。這個算法裝簡單。到最終抽到數據在概率範圍內時,就將等級id返回。

    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; 
        
        } 

    /*上面是獲取抽獎等級結果的方法,那麼在下面這裏設置一下中獎相關數據,以數組的形式表示,
      *id   中獎id
      *v    中獎概率
      *p    中獎獎品
      *注:所配置概率值必需為整數
      */

    $prize_arr = array( 
            array('id'=>1,'v'=>5, 'p'=>'一等獎'), 
            array('id'=>2,'v'=>10,'p'=>'二等獎'), 
            array('id'=>3,'v'=>10,'p'=>'三等獎'), 
            array('id'=>4,'v'=>20,'p'=>'四等獎'), 
            array('id'=>5,'v'=>25,'p'=>'優秀獎'), 
            array('id'=>6,'v'=>30,'p'=>'安慰獎'), 
        ); 

    /*
      *獎項相關數據設置完畢之後,接下來我們要做的就是要將中獎的數組數據重組生成:等級id=>等級對的應概率,這種方式交給get_rand方法去獲取得最終中獎的等級id
    */

    $rand_arr = array();
    foreach ($prize_arr as $key => $val) { 
        $rand_arr[$val['id']] = $val['v']; 
    }
    $rval = get_rand($rand_arr); //根據概率獲取中獎的等級id

    //最後獲取得到$rval這個就是中獎的等級id,根據這個id,我們就可以處理獎項數據

    $lucky = $unlucky = array();
    foreach($prize_arr as $key=>$val){
        if($val['id']==$rval){
            $lucky = $val;
        }else{
            $unlucky[] = $val;
        }
    }
    

    /*到了這裏,中獎的信息與沒有中獎的信息已經分開兩數組存放,。到最後就是處理結果,這裏簡單處理一下,看一下效果。到此,php處理的抽獎信息部分已經完成,至於其它的相關聯的處理操作,例如如果異步js的操作,這些不在此列出**/

    echo '恭喜你獲得:'.$lucky['p'];
  • 相关阅读:
    非对称加密-RSA公钥加密,私钥解密,私钥加签,公钥验签
    设置mysql数据库本地连接或外部可连接
    mysql自增长主键,删除数据后,将主键顺序重新排序
    非Service层和Controller层调用ssm框架中的方法
    DES加密算法(密文只有字符串和数字)java和android加密的结果一致(可放在url中)
    SpringBoot ajax Restful整合
    java中线程执行流程详解
    在 CSS 中直接引用 fontawesome 图标(附码表)
    C++内存管理~
    操作系统那些事儿
  • 原文地址:https://www.cnblogs.com/helin/p/3051889.html
Copyright © 2020-2023  润新知