<?php var_dump(getRandomAmount(5, 25, 0.1, 10));//总金额25元,5个人,最小金额0.1,最大金额10元。 /** * 砍价算法-生成砍价金额 * * @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) { echo '222'; return false; } $arr = genRandomAmount($people, $totalAmount, $min, $max); // 有几率会因为递归调用超出限制而返回空数组,这里继续重新生成,直到金额正确 while (empty($arr)) { $arr = genRandomAmount($people, $totalAmount, $min, $max); } return $arr; }
array(5) { [0]=> float(9.82) [1]=> float(4.69) [2]=> float(0.3) [3]=> float(7.16) [4]=> float(3.03) }
php砍价或者红包
继续阅读与本文标签相同的文章
上一篇 :
php上传图片安全处理,防止图片木马
下一篇 :
.htaccess 常用规则
-
阿里云Linux服务器动态扩容(阿里云服务器扩容后磁盘空间无变化解决方法)
2020-11-30栏目: 建站教程
-
6个SEM实战技巧,大神手把手教你做推广!
2020-07-20栏目: SEM
-
苏州美食推荐,持续更新
2020-06-17栏目: 生活笔记
-
企业如何玩转视频号
2020-05-12栏目: 运营杂谈
-
SEO关键词排名该掌握的核心优化技巧
2020-05-12栏目: SEO
打印
分享
发表评论 已发布 0 条