最近在做抽奖活动的时候,被同事提出自己写的抽奖算法很不科学,后来查阅了网络上相关的抽奖代码,算法也跟自己的类似,拿把奖品拿去循环判断。后来想了一下,确实看着逻辑都很不科学了,更不用说是测试结果,于是修改了一下代码,然后测试一下结果这才算是正常了,以下是更正后的测试代码。
<!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的中奖概率,可是点得你手软的时候还是给你安慰奖或者不中奖,所以说经常在网络上看到一些转盘,砸金蛋之类的抽奖活动,各种超值奖品只要你来参加,就有机会拿回家,让你无法淡定。如果你也中了一等奖,那就请你摆桌吧,因为真的不容易呀。