【PHP原生】随机红包分类算法

随机红包分配算法

1、数值波动大

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的
$total=10;//红包总额
$num=8;// 分成8个红包,支持8人随机领取
$min=0.01;//每个人最少能收到0.01元
for($i=1;$i<$num;$i++)
{
  $safe_total=$total-($num-$i)*$min;//随机安全上限
  $money=mt_rand($min*100,$safe_total*100)/100;
  $total=$total-$money;
  echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>';
}
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

 


2、波动较小
<?php
/**
* 生成随机数(返回数组)
*$send_total 总额
* $send_min 最小值
* $send_max 最大值
* $count 总人数
* return Array
*/
function randMoney($send_total, $send_min, $send_max, $count)
{
  $money = $send_total - $send_min * $count; //$money表示可以用于分配的金额
  $people = array_fill(0, $count, $send_min); //$people是一个以最小金额值组成的一位数组,元素个数等于$count
  do{
    $lucky_index = mt_rand(0, $count -1); //$lucky_index表示下标为$people数组的任意随机元素
    $lucky_money = floatval(substr(mt_rand()/ mt_getrandmax(),0,4)); //$lucky_money表示任意小数
  if($people[$lucky_index]+ $lucky_money > $send_max){
    continue;
  }
  if($money <1){
//剩余可分配的金额小于1时,直接全部赋予累加到$people数组的某个元素上(满足所有金额相加等于总金额)
//可能会导致某个分配金额超过最大值。$m = $money语句改成break即可避免。
  $m = $money;
  }else{
    $m = $lucky_money;
  }
   $people[$lucky_index]+= $m;
  $money -= $m;
}while($money >0);
  return $people;
}

 

 

 

posted @ 2018-10-16 09:44  PHPer_Cody  阅读(223)  评论(0)    收藏  举报