php编写的抽奖程序中奖概率算法
们先完成后台PHP的流程,PHP的主要⼯作是负责配置奖项及对应的中奖概率,当前端页⾯点击翻动某个⽅块时会想后台PHP发送ajax请求,那么后台PHP根据配置的概率,通过概率算法给出中奖结果,同时将未中奖的奖项信息⼀并以JSON数据格式发送给前端页⾯。
先来看概率计算函数
function get_rand($proArr) {
$result = '';
//概率数组的总概率精度
$proSum = array_sum($proArr);
//概率数组循环
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur) {php的工作流程
$result = $key;
break;
} else {
$proSum -= $proCur;
}
}
unset ($proArr);
return $result;
}
上述代码是⼀段经典的概率算法,$proArr是⼀个预先设置的数组,假设数组为:array(100,200,300,
400),开始是从1,1000这个概率范围内筛选第⼀个数是否在他的出现概率范围之内,如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第⼆个数是在1,900这个范围内筛选的。这样筛选到最终,总会有⼀个数满⾜要求。就相当于去⼀个箱⼦⾥摸东西,第⼀个不是,第⼆个不是,第三个还不是,那最后⼀个⼀定是。这个算法简单,⽽且效率⾮常⾼,关键是这个算法已在我们以前的项⽬中有应⽤,尤其是⼤数据量的项⽬中效率⾮常棒。
接下来我们通过PHP配置奖项。
$prize_arr = array(
'0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),
'1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
'2' => array('id'=>3,'prize'=>'⾳箱设备','v'=>10),
'3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),
'4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
'5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
);
该⼆维数组,记录了所有本次抽奖的奖项信息,其中id表⽰中奖等级,prize表⽰奖品,v表⽰中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的⼏率是0,数组中v的总和(基数),基数越⼤越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之⼀了。
每次前端页⾯的请求,PHP循环奖项设置数组,通过概率计算函数get_rand获取抽中的奖项id。将中奖奖品保存在数组$res['yes']中,⽽剩下的未中奖的信息保存在$res['no']中,最后输出json个数数据给前端页⾯。
foreach ($prize_arr as $key => $val) {
$arr[$val['id']] = $val['v'];
}
$rid = get_rand($arr); //根据概率获取奖项id
$res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项
unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项
shuffle($prize_arr); //打乱数组顺序
for($i=0;$i<count($prize_arr);$i++){
$pr[] = $prize_arr[$i]['prize'];
}
$res['no'] = $pr;
echo json_encode($res);
另附上⼀个⽹友的实现⽅法
/**
* 抽奖
* @param int $total
*/
function getReward($total=1000)
{
$win1 = floor((0.12*$total)/100);
$win2 = floor((3*$total)/100);
$win3 = floor((12*$total)/100);
$other = $total-$win1-$win2-$win3;
$return = array();
for ($i=0;$i<$win1;$i++)
{
$return[] = 1;
}
for ($j=0;$j<$win2;$j++)
{
$return[] = 2;
}
for ($m=0;$m<$win3;$m++)
{
$return[] = 3;
}
for ($n=0;$n<$other;$n++)
{
$return[] = '谢谢惠顾';
}
shuffle($return);
return $return[array_rand($return)];
}
$data = getReward();
echo $data;
>
以上所述就是本⽂的全部内容了,希望⼤家能够喜欢。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。