php 中奖概率换算

源代码
$proArr = array(
            array('id'=>1,'name'=>'特等奖','v'=>1),
            array('id'=>2,'name'=>'一等奖','v'=>222),
            array('id'=>3,'name'=>'二等奖','v'=>333),
            array('id'=>4,'name'=>'三等奖','v'=>4444),
            array('id'=>5,'name'=>'谢谢惠顾','v'=>9999)
        );
        $res=$this->get_rand1($proArr);
/**
     * 不同概率的抽奖原理就是把0到*(比重总数)的区间分块
     * 分块的依据是物品占整个的比重,再根据随机数种子来产生0-* 中的某个数
     * 判断这个数是落在哪个区间上,区间对应的就是抽到的那个物品。
     * 随机数理论上是概率均等的,那么相应的区间所含数的多少就体现了抽奖物品概率的不同。
     * @param $proArr
     * @return array
     */
    function get_rand1($proArr)
    {
        $result = array();
        foreach ($proArr as $key => $val) {
            $arr[$key] = $val['v'];
        }
        // 概率数组的总概率
        $proSum = array_sum($arr);
        asort($arr);
        // 概率数组循环
        foreach ($arr as $k => $v) {
            $randNum = mt_rand(1, $proSum);
            if ($randNum <= $v) {
                $result = $proArr[$k];
                break;
            } else {
                $proSum -= $v;
            }
        }
        return $result;
    }

posted @ 2020-07-18 17:28  办公魔盒  阅读(148)  评论(0编辑  收藏  举报