红包随机金额

php

浏览数:390

2019-1-7

/**
 * @param $total 总金额
 * @param $num 红包数
 * @param float $min 每个红包最小金额
 * @return array
 */
function hongbao($total, $num, $min=0.01 ){
    $list = array();
    for ($i=1;$i<$num;$i++)
    {
        $safe_total=($total-($num-$i)*$min)/($num-$i); //随机安全上限
        $money=mt_rand($min*100,$safe_total*100)/100;
        $total=$total-$money;
        array_push( $list, $money );
    }
    array_push( $list, round($total, 2) );
    shuffle($list);
    return $list;
}//二 最小金额随机
function hongbao($total, $num ){
    $ex = $total/$num/2;
    $min = mt_rand(1, $ex*100) / 100; //随机最小金额
    $list = array();
    for ($i=1;$i<$num;$i++)
    {
        $safe_total=($total-($num-$i)*$min)/($num-$i);
        $money=mt_rand($min*100,$safe_total*100)/100;
        $total=$total-$money;
        array_push( $list, $money );
    }
    array_push( $list, round($total, 2) );
    shuffle($list);
    return $list;
}

/** 三:
 * 红包生成算法
 * @param $money    总金额
 * @param $number   红包数量
 * @param $ratio    浮动系数
 */
function hongbao2($money,$number,$ratio = 0.5){
    $res = array(); //结果数组
    $min = ($money / $number) * (1 - $ratio);   //最小值
    $max = ($money / $number) * (1 + $ratio);   //最大值
    /*--- 第一步:分配低保 ---*/
    for($i=0;$i<$number;$i++){
        $res[$i] = $min;
    }
    $money = $money - $min * $number;
    /*--- 第二步:随机分配 ---*/
    $randRatio = 100;
    $randMax = ($max - $min) * $randRatio;
    for($i=0;$i<$number;$i++){
        //随机分钱
        $randRes = mt_rand(0,$randMax);
        $randRes = $randRes / $randRatio;
        if($money >= $randRes){ //余额充足
            $res[$i]    += $randRes;
            $money      -= $randRes;
        }
        elseif($money > 0){     //余额不足
            $res[$i]    += $money;
            $money      -= $money;
        }
        else{                   //没有余额
            break;
        }
    }
    /*--- 第三步:平均分配上一步剩余 ---*/
    if($money > 0){
        $avg = $money / $number;
        for($i=0;$i<$number;$i++){
            $res[$i] += $avg;
        }
        $money = 0;
    }
    /*--- 第四步:打乱顺序 ---*/
    shuffle($res);
    /*--- 第五步:格式化金额(可选) ---*/
    foreach($res as $k=>$v){
        //两位小数,不四舍五入
        preg_match('/^\d+(\.\d{1,2})?/',$v,$match);
        $match[0]   = round($match[0],2);
        $res[$k]    = $match[0];
    }

    return $res;
}