客户需求:指定一个目标金额,每次砍价减少在指定金额范围内的随机金额,判断砍价是否成功,如果成功为剩余金额为0,失败剩余金额为负数。
根据此需求整理了一个函数,提供给大家参考下。
/**
* 根据剩余金额,再倒数第三次抽奖后控制获取下一次砍价的随机值
* $this->min_money 砍价范围金额最小值
* $this->max_money 砍价范围金额最大值
* $money 需要砍价的金额
*/
function getRand($money, $is_prize = 0) {
if ($money <= 0) {
return 0;
}
//最后2次抽奖为最小值的和
$min = $this->min_money * 2;
//最后2次抽奖为最大值的和
$max = $this->max_money * 2;
//中间值
//$mid = $this->max_money - $this->min_money;
//和值
$sum = $this->max_money + $this->min_money;
//警戒值,进入此值范围后人工控制随机金额范围,根据是否中奖判断值是否超标
//最后3次抽奖人工控制随机数范围
$m = ($min + $this->max_money) - 1;
//警戒值范围外取随机数
if ($money > $m) {
$r = rand($this->min_money, $this->max_money);
} else if ($money >= $min && $money <= $m) {
//倒数第三次
//剩余金额处于警戒值和2次最小值之间
if ($money >= $max) {
//位于警戒值和上限之间
$r = rand($this->min_money, $this->min_money + ($money - $max));
} else {
//第二次抽奖控制范围
if ($money >= $sum) {
$r = rand(round(($money / 2), 0), $this->max_money);
} else {
$r = rand($this->min_money, round(($money / 2), 0));
}
}
} else {
//第三次
if ($is_prize) {
$r = $money;
} else {
$r = rand($money + 1, $this->max_money);
}
}
return $r;
}