/**
* 砍价算法-生成砍价金额
*
* @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;
}
 

php砍价算法、随机红包金额算法的更多相关文章

  1. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  2. 重启随机游走算法(RWR:Random Walk with Restart)

    1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决.在互联网上,如果一个网页被很多其他网页所链接,说明它受到普遍的承认和信赖,那 ...

  3. java使用BigDecimal 实现随机金额红包拆分算法

    原创代码,引用注明出处:https://www.cnblogs.com/guangxiang/p/12218714.html @Servicepublic class SplitRedPacketsS ...

  4. php 随机红包算法

    <?php /** * 红包分配算法 * * example * $coupon = new Coupon(200, 5); * $res = $coupon->handle(); * p ...

  5. PHP随机红包算法

    2017年1月14日 14:19:14 星期六 一, 整体设计 算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用redis decr()命令去限流, 用mysql去记 ...

  6. php 固定红包 + 随机红包算法

    <?php /** * 随机红包+固定红包算法[策略模式] * copyright (c) 2016 http://blog.csdn.net/CleverCode */ //配置传输数据DTO ...

  7. java实现微信红包分配算法

    红包算法分析 有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然 ...

  8. PHP用抛物线的模型实现微信红包生成算法的程序源码

    <?php /* *Author:Kermit *Time:2015-8-26 *Note:红包生成随机算法 */ header("Content-type:text/html;cha ...

  9. PHP微信红包生成算法的程序源码(用抛物线的模型实现)

    代码如下: <?php /* * 红包生成随机算法 */ header("Content-type:text/html;charset=utf-8"); date_defau ...

随机推荐

  1. andorid jar/库源码解析之Bolts

    目录:andorid jar/库源码解析 Bolts: 作用: 用于链式执行跨线程代码,且传递数据 栗子: Task.call(new Callable<Boolean>() { @Ove ...

  2. socket编程之并发回射服务器

    使用到的函数: // 子进程返回0,父进程返回子进程ID,出错返回-1 pid_t fork(void); pid_t wait(int *wstatus); // 最常用的option是WNOHAN ...

  3. lh的简单图论

    lh的简单图论 http://10.64.70.166/problem/1112 lh的简单图论   Description 众所周知,集训队的lh同学txdy,有一天他在写着代码,突然哼起了rapr ...

  4. B. Heaters 思维题 贪心 区间覆盖

    B. Heaters 这个题目虽然只有1500的分数,但是我还是感觉挺思维的,我今天没有写出来,然后看了一下题解 很少做这种区间覆盖的题目,也不是很擅长,接下来讲讲我看完题解后的思路. 题目大意是:给 ...

  5. vue.prototype和vue.use的区别和注意点

    1.vue.prototype:实例上挂载属性/方法,例如Vue.prototype.axios = axios; 2.vue.use:引入插件,例如vuex,vue.use(vuex)如图,vue. ...

  6. Spring Cloud 系列之 Config 配置中心(一)

    服务配置现状 配置文件是我们再熟悉不过的,在微服务系统中,每个微服务不仅仅只有代码,还需要连接其他资源,例如数据库的配置或功能性的开关 MySQL.Redis .Security 等相关的配置.除了项 ...

  7. 【Kafka】Kafka简单介绍

    目录 基本介绍 概述 优点 主要应用场景 Kafka的架构 四大核心API 架构内部细节 基本介绍 概述 Kafka官网网站:http://kafka.apache.org/ Kafka是由Apach ...

  8. Scrapy模块使用出错,出现builtins.ImportError: DLL load failed: 找不到指定的程序

    问题描述:初次学习scrapy,使用scrapy官方文档创建爬虫项目出错, 出现builtins.ImportError: DLL load failed: 找不到指定的程序, ImportError ...

  9. 【c++ 重载】

    重载"[]": #include <iostream> #include <string> using namespace std; struct Node ...

  10. Spring Boot 入门(十三):集成Hasor的Dataway模块,干掉后台,自动配置接口

    终于出湖北了,封闭2个月,家里没电脑,感觉好久没自主撸代码啊啊啊啊啊啊啊啊啊啊啊啊啊. 连接上篇文章Spring Boot 入门(十二):报表导出,对比poi.jxl和esayExcel的效率,继续从 ...