/**
* 砍价算法-生成砍价金额
*
* @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. Android RecyclerView滚动类控件修改、去掉滑动边界的阴影效果

    前言 滚动类控件,大家都用的很多,如 RecyclerView.NestedSrollView.... 下面以recyclerView为例讲解,其他滚动控件也同理. RecyclerView 滚动列表 ...

  2. Python爬虫(二)爬百度贴吧楼主发言

    爬取电影吧一个帖子里的所有楼主发言: # python2 # -*- coding: utf-8 -*- import urllib2 import string import re class Ba ...

  3. Spring官网阅读(十三)ApplicationContext详解(下)

    文章目录 BeanFactory 接口定义 继承关系 接口功能 1.HierarchicalBeanFactory 2.ListableBeanFactory 3.AutowireCapableBea ...

  4. 花了几天入门Storm,上了一版,全是Bug

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 听说过大数据的同学应该都听说过Storm吧?其实 ...

  5. Go中操作mysql

    Go中操作mysql 首先在mysql里的test数据库中创建数据表 CREATE TABLE `userinfo` ( `uid` INT(10) NOT NULL AUTO_INCREMENT, ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目

    首先,默认咱们已经有了.net core 3.1的开发环境,如果你没有,快去下载... https://dotnet.microsoft.com/download 由于项目是基于abp vNext开发 ...

  7. 详解 Spark 中的 Bucketing

    什么是 Bucketing Bucketing 就是利用 buckets(按列进行分桶)来决定数据分区(partition)的一种优化技术,它可以帮助在计算中避免数据交换(avoid data shu ...

  8. mysql计算

    select @csum := 0;select create_time,merchant_id,award as 奖励,total_count as 数量,(@csum := @csum + awa ...

  9. C# 微信公众平台开发(5)--添加图文素材

      微信公众平台开发 --添加素材 关于微信公众号素材管理,我们可以通过接口文档,了解基本详情:http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449 ...

  10. 「雕爷学编程」Arduino动手做(25)——MQ2气敏检测模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...