砍价获取金额

本文深入解析了一种砍价算法,该算法能够根据砍价人数、砍价总额、最低及最高砍价金额等参数,生成合理的砍价金额分配方案。通过递归调用确保最终分配的总金额与设定的砍价总额相符,同时避免单次砍价金额超出预设范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 砍价算法-生成砍价金额
 *
 * @param int $people   砍价人数或次数
 * @param int $amount   砍价总额 单位元
 * @param int $min      最低砍价金额 不得低于0
 * @param int $max      最高砍价金额 砍价次数 * 最高砍价金额不得小于砍价总额
 * @param int $level    层级 防止递归超出限制
 *
 * @return array
 */
function genRandomAmount($people = 0, $totalAmount = 0, $min = 0, $max = 0, $level = 1)
{
    // 防止递归超出限制报异常,提前退出
    if ($level == 200) {
        return [];
    }

    $arr = [];

    // 数据错误直接返回
    if (empty($people) || empty($totalAmount)) {
        return [];
    }

    // 转换成分便于计算
    $tmpTotal = $totalAmount * 100;
    $tmpMin = $min * 100;
    $tmpMax = $max * 100;

    // 计算n-1次的随机金额,如果不减1,则会出现多减一次随机金额的问题,应该是最后的金额直接赋值
    for ($i = 0; $i < $people - 1; $i++) {
        $arr[$i] = mt_rand($tmpMin, $tmpMax);
        $tmpTotal = $tmpTotal - $arr[$i];
    }

    // 最后的价格直接使用最后剩余的价格
    $arr[$people - 1] = $tmpTotal;

    // 最后一次价格小于最小金额或者大于最大金额都不对,继续递归重新计算
    if ($tmpTotal < $tmpMin || $tmpTotal > $tmpMax) {
        return genRandomAmount($people, $totalAmount, $min, $max, $level + 1);
    }

    // 返回单位元的数据
    return array_map(function ($value) {
        return $value / 100;
    }, $arr);
}

/**
 * 砍价算法-获取砍价金额
 *
 * @param int $people   砍价人数或次数
 * @param int $amount   砍价总额
 * @param int $min      最低砍价金额 不得低于0
 * @param int $max      最高砍价金额 砍价次数 * 最高砍价金额不得小于砍价总额
 *
 * @return array
 */
function getRandomAmount($people = 0, $totalAmount = 0, $min = 0, $max = 0)
{
    // 数据错误直接返回
    if (empty($people) || empty($totalAmount)) {
        return [];
    }

    if ($people * $max <= $totalAmount) {
        return false;
    }

    $arr = genRandomAmount($people, $totalAmount, $min, $max);

    // 有几率会因为递归调用超出限制而返回空数组,这里继续重新生成,直到金额正确
    while (empty($arr)) {
        $arr = genRandomAmount($people, $totalAmount, $min, $max);
    }

    return $arr;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小关@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值