分享一个简易PHP红包随机分配算法

一个外包项目需要给用户发红包,本想看看有没有朋友开发过,直接复制一段代码的。但是看了网上很多都是封装的类。虽然写的都很棒,不过我觉得一个红包分配没必要搞那么复杂。因此仿照别人的代码实现了一个简易版的红包随机分配算法,支持普通红包和拼手气红包。

完整方法:

  1. /**
  2.      * $total float 红包总额
  3.      * $num integer 红包个数
  4.      * $type string normal平分红包,其他值随机分配
  5.      * $min float 最小红包金额
  6.      */
  7. function cal_hongbao($total$num = 1,$type='normal',$min = 0.01)
  8.     {
  9.         $money_arr = array();
  10.         $return_arr = array();
  11.         if($type == 'normal'){
  12.             //普通红包
  13.             $amount = bcdiv($total,$num,2);
  14.             $money_arr = array_fill(0,$num,$amount);
  15.         }else{
  16.             //拼手气红包
  17.             for ($i = 1; $i <$num; ++$i) {
  18.                 $max =round($total, 2)/($num-$i);
  19.                 $random =  0.01+ mt_rand() / mt_getrandmax() * (0.99- 0.01);
  20.                 $money = $random*$max;
  21.                 $money = $money<=$min?0.01:$money;
  22.                 $money =floor($money*100)/100;
  23.                 $total = $total - $money;
  24.                 $money_arr[$i] = round($money, 2);
  25.             }
  26.             $money_arr[$i] = round($total, 2);
  27.             shuffle($money_arr);
  28.         }
  29.         $return_arr['money'] = $money_arr;
  30.         $return_arr['total'] = array_sum($money_arr);
  31.         return $return_arr;
  32.     }

备注:

①普通红包可能会存在总金额不能均分的情况,这个时候大家可以自行处理,可以让用户修改发红包的金额,或者把多余部分随机给其中一人增加上去。这个需要自行处理。

测试方法就不写了。省点字。

 

2022/11/28更新方法,支持把总额分成随机小整数,需要自行判断红包总额大于总个数的问题。否则会以最小数填充数组。

  1. /**
  2.      * $total float 红包总额
  3.      * $num integer 红包个数
  4.      * $type string normal平分红包,其他值随机分配
  5.      * $min float 最小红包金额
  6.      */
  7.     function cal_hongbao($total, $num = 1,$type='normal',$min = 0.01)
  8.     {
  9.         $money_arr = array();
  10.         $return_arr = array();
  11.         if($type == 'normal'){
  12.             //普通红包
  13.             $amount = bcdiv($total,$num,2);
  14.             $money_arr = array_fill(0,$num,$amount);
  15.         }elseif ($type == 'fumi'){
  16.             //福米红包,把总额分成N个小整数,总和=总额
  17.             $can = $total-$num; //剩余可分配的数额
  18.             for ($i=$num;$i>0;$i--){
  19.                 $money_arr[$i] = 1//每个数字最小为1
  20.                 $ls_money = 0;
  21.                 if($can > 0){
  22.                     if($i == 1){
  23.                         $money_arr[$i] += $can;
  24.                     }else{
  25.                         $max_money = floor($can/$i);
  26.                         $ls_money = mt_rand(0,$max_money);
  27.                         $money_arr[$i] += $ls_money;
  28.                     }
  29.                 }
  30.                 $can -= $ls_money;
  31.             }
  32.             shuffle($money_arr);
  33.         }else{
  34.             //拼手气红包
  35.             for ($i = 1; $i <$num; ++$i) {
  36.                 $max =round($total, 2)/($num-$i);
  37.                 $random =  0.01+ mt_rand() / mt_getrandmax() * (0.990.01);
  38.                 $money = $random*$max;
  39.                 $money = $money<=$min?0.01:$money;
  40.                 $money =floor($money*100)/100;
  41.                 $total = $total - $money;
  42.                 $money_arr[$i] = round($money, 2);
  43.             }
  44.             $money_arr[$i] = round($total, 2);
  45.             shuffle($money_arr);
  46.         }
  47.         $return_arr['money'] = $money_arr;
  48.         $return_arr['total'] = array_sum($money_arr);
  49.         return $return_arr;
  50.     }

 

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!