php笔记:抽奖概率算法

   最近在做抽奖活动的时候,被同事提出自己写的抽奖算法很不科学,后来查阅了网络上相关的抽奖代码,算法也跟自己的类似,拿把奖品拿去循环判断。后来想了一下,确实看着逻辑都很不科学了,更不用说是测试结果,于是修改了一下代码,然后测试一下结果这才算是正常了,以下是更正后的测试代码。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>概率计算代码</title>
</head>
<?php

// 获取中奖奖品下标
function _get_bingo_index($arr_prize){
     
    // 计算总概率精度
    $rand_num_max = 0;
    foreach($arr_prize as $k => $v){
        $rand_num_max += $v[‘rate‘];
    }
    
    // 初始化随机数,奖品区间
    $rand_num = mt_rand(1, $rand_num_max);
    $left_interval = 0;
    $right_interval = 0;
    $last_right_interval = 0;
    
    foreach($arr_prize as $k => $v){
        // 左区间
        $left_interval = $last_right_interval;
        // 右区间
        $right_interval = $left_interval + $v[‘rate‘];
        // 上一个右区间
        $last_right_interval = $right_interval;        
        // 判断随机数是否落在对应的区间
        if($left_interval < $rand_num && $rand_num <= $right_interval){
            return $k;
        }
    }
}

// 总概率精度是100,这样比较好计算概率是否正常
$arr_prize = array( 
    array(‘id‘ => 1, ‘name‘ => ‘一等奖‘, ‘rate‘ => 1), 
    array(‘id‘ => 2, ‘name‘ => ‘二等奖‘, ‘rate‘ => 5), 
    array(‘id‘ => 3, ‘name‘ => ‘三等奖‘, ‘rate‘ => 10), 
    array(‘id‘ => 4, ‘name‘ => ‘四等奖‘, ‘rate‘ => 12), 
    array(‘id‘ => 5, ‘name‘ => ‘五等奖‘, ‘rate‘ => 22), 
    array(‘id‘ => 6, ‘name‘ => ‘不中奖‘, ‘rate‘ => 50), 
);

// 中奖概率测试
$bingo_test = array(0,0,0,0,0,0);
$lottery_count = 10000;
$i = 0;

while($i++ < $lottery_count){
    $bingo_index = _get_bingo_index($arr_prize);
    $bingo_test[$bingo_index]++;
}

foreach($bingo_test as $k => $v){
    echo $arr_prize[$k][‘name‘] , ‘中奖几率:‘ , ($v / $lottery_count) * 100 , ‘%<br />‘;
}

?>
<body>
</body>
</html>

 

  程序里面可以随意将大奖的中奖概率改成很低甚至是限制中奖次数,所以明明看上去是1/3的中奖概率,可是点得你手软的时候还是给你安慰奖或者不中奖,所以说经常在网络上看到一些转盘,砸金蛋之类的抽奖活动,各种超值奖品只要你来参加,就有机会拿回家,让你无法淡定。如果你也中了一等奖,那就请你摆桌吧,因为真的不容易呀。 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。