php设置中奖概率算法(二)

<?php
  /**
    *  $prize_arr 参与抽奖人员数据
    *  id: 一般是成员ID
    *  name 姓名
    *  v   得奖概率
    ***/
    $prize_arr = array( 
        '0' => array('id'=>1,'name'=>'小王','v'=>1), 
        '1' => array('id'=>2,'name'=>'小李','v'=>5), 
        '2' => array('id'=>3,'name'=>'小张','v'=>99),
		'3' => array('id'=>3,'name'=>'小赵','v'=>99),
		'4' => array('id'=>3,'name'=>'小张','v'=>99)
    );  
 
    foreach ($prize_arr as $key => $val) { 
        $arr[$key] = $val['v']; 
    } 
 
    $total_num = count($prize_arr); //设定得中奖人数量
 
    $temp_rest=array();
    for($i=0;$i<$total_num;$i++)
    {
        $rid = get_rand($arr,true); //根据概率获取人员ID
        $temp_rest[]= $prize_arr[$rid]; //中奖项
        unset($prize_arr[$rid]); 
        unset($arr[$rid]); 
    }
 
    print_r($temp_rest);//得出结果
 
    /****
    *   得出当前中奖人
    *   $is_status是否开启概率为100必中: 默认不开启 
    ***/
    function get_rand($proArr,$is_status = false) { 
        $result = ''; 
        if($is_status){
            $rest = get_100($proArr);  //调用获取100命中
        }else{ 
            $rest ='';
        }
 
        if(empty($rest) || !isset($rest)){
            //概率数组的总概率精度
            $proSum = array_sum($proArr); 
            //概率数组循环
            foreach ($proArr as $key => $proCur) { 
                $randNum = mt_rand(1, $proSum); 
                if ($randNum <= $proCur) { 
                    $result = $key; 
                    break; 
                } else { 
                    $proSum -= $proCur; 
                }   
            } 
        }else{
            $result = $rest;
        }
        unset ($proArr); 
        return $result; 
    }
    function get_100($arr_mast){
        $result = ''; 
        foreach ($arr_mast as $key => $value_mast) { 
           if($value_mast== 100){
                $result = $key; 
                break; 
           }
 
        } 
        unset ($arr_mast); 
        return $result; 
    }
?>

发表评论

邮箱地址不会被公开。 必填项已用*标注