红包算法

在所有奖品之中随机抽样,抽样越大,则概率也平均

 

//抽奖奖金位置设置
$prize_array = array(
508 => 1,
509 => 2,
510 => 3,
511 => 8,
512 => 4,
513 => 7,
514 => 6,
515 => 5,
);

/*获取每一个奖品的概率*/
function get_rate($arr){
foreach ($arr as $key => $val) {
$arr[$val['id']] = ($val['num'] - $val['numout'])>0?($val['num'] - $val['numout']):0; //随着被抽取的数量减少,其他的概率变大
}
return $arr;
}

/*随机数函数*/
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;
}

 

 

2.

pointlevel=array(5,10,20,30,50,100,200); //阶梯抽奖,每次扣除的积分不同。第一次5分,第二次10分。
$jpid2pid=array(484=>1,488=>2,485=>3,487=>4,489=>5,486=>6,490=>7,0=>8); //奖金位置

function ztchoujiang($point_app,$todaynum,$alldaynum,$thisjpid,$have490) {
//不同分数等级要给不同的中奖概率。
$lvlist=array(
1=>array(1,3,3,0,0,1,0),
2=>array(3,1,3,3,0,1,0),
3=>array(1,0,1,0,3,0,2),
4=>array(3,0,1,1,0,1,0),
5=>array(1,0,1,0,1,0,1),
6=>array(3,1,0,3,1,0,0),
7=>array(1,0,1,0,1,0,1)
);
$lv=intval($lvlist[count($alldaynum)+($todaynum>0?0:1)][$todaynum]);

if ($lv==0) $thisjpid=array(484); //没抽到 改为只有0.1

if ($lv==2 and $have490) $thisjpid[]=490;//有机会抽到5元
if ($lv==3) $thisjpid=array(488,487,486,485,484); //有机会抽除5元和2元的

return $thisjpid[array_rand($thisjpid)];
}

获取到id之后要判断每一种红包的份额是否发完,发完则替换成最低金额id或者谢谢参与,在操作表的时候要锁表,防止并发,并且异步通知用户中奖

posted @ 2018-08-21 15:46  我是叮当啊  阅读(307)  评论(0编辑  收藏  举报