梦想之家

php红包开发的两个模式,按总金额、按最高最低

php红包开发的两个模式,代码如下

<?php


//按总金额随机发放红包,先抢先得,最低0.3元,最高5元  预计1000元能发350-400个红包,抢完总金额就结束;单个的红包金额相对指定红包数的模式会多些。
//按总金额随机发放红包,先到先得,最低0.3元,最高5元  预计1000元能发350-400个红包
$srcMoney = $money = 1000;  //红包总金额
$minMoney = 0.30;           //最少的红包金额
$maxMoney = 5;              //最高的红包金额
$temPool = [];
while ($money > $minMoney) {
    //随机产生的红包金额
    $cash = mt_rand($minMoney * 100, $maxMoney * 100) / 100;
    //统计已经在队列里的红包总金额
    $totMoney = array_sum($temPool);
    //如果已存在总金额+生成的总金额大于了 可以发放的总金额,则修改产生的
    if ($totMoney + $cash > $srcMoney) {
        $cash = round($srcMoney - $totMoney, 2);
    }
    //修改总金额
    $money = round($money - $cash, 2);
    $temPool[] = $cash;
}
dd($money);
dd('总共:' . count($temPool) . '个红包');
dd('发出去的红包金额:' . array_sum($temPool) . '元');
dd('剩余金额:' . round($money, 2) . '元');
dd('最大金额:' . max($temPool) . '元');
dd('最小金额:' . min($temPool) . '元');
dd($temPool);


//按总金额:1000元,指定红包数量600个,发放最低金额:0.30元,最高金额:(1000/600*4) ≈ 7 元以下,抢完总数量就结束;单个的红包金额不多。
$money = 1000;      //红包总金额
$number = 600;      //红包的数量
$minMoney = 0.30;   //最少红包金额
$maxMoney = round($money / $number * 4);   //最多红包金额
$ll = getRedPackage($money, $number, $minMoney, $maxMoney);

dd('总金额:' . array_sum($ll));
dd('总数量:' . count($ll));
dd('最大红包:' . max($ll));
dd('最小红包:' . min($ll));
dd($ll);

#红包算法 (最大金额和最小金额)
function getRedPackage($money, $num, $min, $max)
{
    $data = array();
    if ($min * $num > $money) {
        return '老板,钱不够啊!';
    }
    if ($money / $num > $max) {
        return '最大金额不能小于: ' . $money / $num . '元!';
    }
    if ($max * $num < $money) {
        return '最大的红包综合值不能小于发放的总金额啊!';
    }
    while ($num >= 1) {
        --$num;
        $kmix = max($min, $money - $num * $max);
        $kmax = min($max, $money - $num * $min);
        $kAvg = $money / ($num + 1);
        //获取最大值和最小值的距离之间的最小值
        $kDis = min($kAvg - $kmix, $kmax - $kAvg);
        //获取0到1之间的随机数与距离最小值相乘得出浮动区间,这使得浮动区间不会超出范围
        $r = ((float)(mt_rand(1, 10000) / 10000) - 0.5) * $kDis * 2;
        $cash = round($kAvg + $r, 2);
        $money -= $cash;
        $data[] = $cash;
    }
    return $data;
}

/**
 * 数据打印格式化
 * @param $data
 * @param int $exit
 */
function dd($data, $exit = 0)
{
    echo '<pre>';
    print_r($data);
    echo '</pre>';
    if ($exit) exit();
}

相关推荐

您此刻的心情: