站三界导航
首页 PHP代码PHP砍价算法

PHP砍价算法

  • PHP代码
  • 来源:站三界导航
  • 101阅读
  • 2022-06-09

1、生成一次砍价金额


$total='1000'; //砍价总额。如果砍价次数固定为100左右,当前价格改为总价
$num='100';// 需要砍价人数
if($num>1){
    $min=0.01;//最低砍价金额
    $safe_total = ($total  - ($num-1) * $min)/($num-1);//随机安全上限
    if($min<$safe_total){//总价为最低价时,算出来的随机上限有可能会比最低价还低
        $total = mt_rand($min * 100, $safe_total * 100) / 100;
    }
	// 保留两位小数
    $total = sprintf("%.2f", $total);   //砍掉的金额
}
print_r($total);die;

2、生成全部砍价金额




/**
 * 砍价算法-生成砍价金额
 * @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;
    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 ($people * $max <= $totalAmount) {
        return false;
    }
    $arr = genRandomAmount($people, $totalAmount, $min, $max);
    // 有几率会因为递归调用超出限制而返回空数组,这里继续重新生成,直到金额正确
    while (empty($arr)) {
        $arr = genRandomAmount($people, $totalAmount, $min, $max);
    }
    return $arr;
}
$res = getRandomAmount(10,100,9.00,20.00);
print_r($res);die;


本文结束
本文来自投稿,不代表站三界导航立场,如若转载,请注明出处:https://www.zhansanjie.com/article/details/8781.html

版权声明:

1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

2、本站仅提供信息发布平台,不承担相关法律责任。

3、若侵犯您的版权或隐私,请联系本站管理员删除。

4、本文由会员转载自互联网,如果您是文章原创作者,请联系本站注明您的版权信息。

分享
站三界导航
本站声明:本站严格遵守国家相关法律规定,非正规网站一概不予收录。本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,站三界导航不承担任何责任。在此特别感谢您对站三界导航的支持与厚爱。