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

函数原文详解,很清晰噢:

上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。
这样筛选到最终,总会有一个数满足要求。
就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。
这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。

 

然后就根据自己的需要定制$proArr变量的内容了,还是不懂得话请参考原文噢。

函数来源于《PHP+jQuery实现翻板抽奖》一文,有什么不清楚者可以转道阅读。

方法二:

/**
 * 简单的抽奖概率函数
 * @param array $rewardArray 概率,如:$rewardArray = array(10, 20, 20, 30, 10, 10),对应各奖品的概率
 * @return int    概率数组的下标
 */
function luckDraw($rewardArray){
    $sum = array_sum($rewardArray);
    if($sum !== 100) {
        return 'Error:The sum of values in $rewardArray Must be equal to 100!';
    }
    //获取随机数
    $rewardNum = mt_rand(0, $sum - 1);
    //echo $rewardNum . '<br/>';
    $totalnum = count($rewardArray);
    //echo $totalnum . '<br/>';
    for($i = 0; $i < $totalnum; $i++) {
        if($i == 0) {
            if($rewardArray[$i] > $rewardNum && $rewardNum >= 0) {
                return $i;
            }
        } else {
            $max = $min = 0;
            for($j = 0; $j <= $i; $j++) {
                $max = $max + $rewardArray[$j];
            }
            for($k = 0; $k < $i; $k++) {
                $min = $min + $rewardArray[$k];
            }
            if($max > $rewardNum && $rewardNum >= $min) {
                return $i;
            }
        }
    }
}

注意:该函数主要是判断产生的随机数所在的概率范围。需要注意的是,这个方法是返回概率的下标,告诉你是那个概率中奖了。比如返回3则证明是概率30中奖了,随机数范围是50-80之间。

实例如下:

$rewardArray = array(10, 20, 20, 30, 10, 10);

//各概率对应值范围
//10,:0-10
//20:10-30
//20:30-50
//30:50-80
//10:80-90
//10:90-100

echo luckDraw($rewardArray);

函数来源于《一个简单的抽奖概率函数》有需要可以移步阅读。