红包算法 java实现
红包算法
首先,如果红包只有一个,本轮直接使用全部金额,确保红包发完。
然后,
计算出本次红包最少要领取多少,才能保证红包领完,即本轮下水位;
本轮最多领取多少,才能保证每个人都领到,即本轮上水位。
主要方式如下:
计算本次红包金额下水位:假设本次领到最小值1分,那接下来每次都领到200元红包能领完,那下水位为1分;如果不能领完,那按接下来每次都领200元,剩下的本轮应全部领走,是本轮的下水位。
计算本轮红包上水位:假设本轮领200元,剩下的钱还足够接下来每轮领1分钱,那本轮上水位为200元;如果已经不够领,那按接下来其他领1分,计算本轮的上水位。
为了使红包金额不要太悬殊,使用红包均值调整上水位。如果上水位金额大于两倍红包均值,那么使用两倍红包均值作为上水位。换句话说,每一轮抢到的红包金额,最高为两倍剩下红包的均值。
最后,获取随机数并用上水位取余,如果结果比下水位还小,则直接使用下水位,否则使用随机金额为本轮拆到金额。
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Random;public class RandomRedPocket implements RedPocket {BigDecimal avgAmount;private BigDecimal totalAmount;private BigDecimal lowestAmount;private Integer remainNum;public RandomRedPocket(BigDecimal totalAmount, int num) {this.totalAmount = totalAmount;this.remainNum = num;this.avgAmount = totalAmount.divide(new BigDecimal(num), 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(2));this.lowestAmount = BigDecimal.valueOf(0.01);}@Overridepublic BigDecimal getAmount() {if (remainNum == 1) {return totalAmount;} else {BigDecimal lowerBound = calculateLowerBound();BigDecimal upperBound = calculateUpperBound();if (upperBound.compareTo(avgAmount) > 0) {upperBound = avgAmount;}remainNum = remainNum - 1;BigDecimal randomAmount = genRandomMoney(lowerBound, upperBound);totalAmount = totalAmount.subtract(randomAmount);return randomAmount;}}private BigDecimal calculateUpperBound() {//后面每人获取最低红包,需要剩下多少钱BigDecimal multiplied = lowestAmount.multiply(BigDecimal.valueOf(remainNum - 1));BigDecimal upperBound = totalAmount.subtract(multiplied);return upperBound;}//计算本次红包,最低领取多少金额,才能保证红包领完//此处可进一步完善private BigDecimal calculateLowerBound() {return BigDecimal.valueOf(0.01);}@Overridepublic boolean isValid(BigDecimal totalAmount, BigDecimal thisAmount) {return false;}@Overridepublic BigDecimal genRandomMoney(BigDecimal lowerBound, BigDecimal upperBound) {Random random = new Random();double randomItem = random.nextDouble();BigDecimal decimal = upperBound.subtract(lowerBound).multiply(new BigDecimal(randomItem)).add(lowerBound);decimal = decimal.setScale(2, RoundingMode.HALF_UP);return decimal;}
}
相关文章:
红包算法 java实现
红包算法 首先,如果红包只有一个,本轮直接使用全部金额,确保红包发完。 然后, 计算出本次红包最少要领取多少,才能保证红包领完,即本轮下水位; 本轮最多领取多少,才能保证每个人都…...
MVCC中的可见性算法
在之前的文章 MVCC详解-CSDN博客中我们已经介绍过了MVCC的原理(read viewundo log),今天来详细的说一下readview的匹配规则(可见性算法) 隔离级别在RC,RR的前提下 Read View是如何保证可见性判断的呢&#…...
Leetcode73矩阵置零
1110-3 代码: 和题解思路差不多 class Solution {public void setZeroes(int[][] matrix) {Set<Integer> setr new HashSet<>();Set<Integer> setc new HashSet<>();for(int i0;i<matrix.length;i){for(int j0;j<matrix[0].leng…...
linux重要的目录之proc和dev目录
/proc/目录 虚拟文件系统,将内核与进程状态归档为文本文件(系统信息都存放这目录下) Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟…...
【组件自定义事件+全局事件总线+消息订阅与发布+TodoList案例——编辑+过度与动画】
组件自定义事件全局事件总线消息订阅与发布TodoList案例——编辑过度与动画 1 组件自定义事件1.1 绑定1.2 解绑1.3 总结1.4 TodoList案例——自定义事件 2 全局事件总线2.1 理解2.2 步骤2.3 TodoList案例——事件总线 3 消息订阅与发布3.1 理解3.2 TodoList案例——消息的订阅与…...
【带头学C++】----- 三、指针章 ---- 3.11 补充重要指针知识(二,拓展基础知识)
1.指针与函数 1.1指针变量作为函数的参数 如果想在函数内部修改外部变量的值,可以将外部变量的地址传递给函数。 在C/C中,函数的参数传递方式有值传递(传递变量的副本)和引用传递(传递变量的地址)。如果希…...
Jmeter分布式性能测试细节+常见问题解决,资深老鸟带你避坑...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Jmeter分布式测试…...
动态表单获取某一项值
<template><div><el-form :model"form" :rules"rules" ref"form"><el-row v-for"(item,index) in form.list" :key"index"><el-col :span"6"><el-form-item label"用户名称…...
短路表达式
什么是短路表达式 作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。这是这两个操作符的一个重要属性。 而在j…...
风力发电场集中监控系统解决方案
安科瑞 崔丽洁 作为清洁能源之一,风力发电场近几年装机容量快速增长。8月17日,国家能源局发布1-7月份全国电力工业统计数据。截至7月底,全国累计发电装机容量约27.4亿千瓦,同比增长11.5%。其中,太阳能发电装机容量约4.…...
SpringDataJpa(二)
三、Spring Data JPA概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring D…...
软件测评中心▏软件功能测试和非功能测试的区别和联系简析
在软件开发的过程中,功能测试和非功能测试是两个重要的环节。功能测试是指对软件的各项功能进行验证和确认,关注软件是否按照需求规格说明书进行了实现,是否满足了用户的功能需求。而非功能测试是指对软件的性能、可靠性、安全性等方面进行测…...
打卡系统有什么用?如何通过日常管理系统提高企业员工的效率?
在当今快速发展的时代,职工的行动管理已成为机构单位工作中至关重要的一环。如何更好地了解和掌握职工的日程安排和行动轨迹,成为了一个值得探讨的问题。为了解决这一难题,“的修”打卡系统应运而生,它为我们提供了一个全面而高效…...
png怎么转jpg?这款图片转格式工具一学就会用
虽然png图片格式是一种无损压缩格式,但是png图片的内存大小也是比较大的,而且兼容性上也没有jpg图片好,许多平台推荐的也都是jpg格式,所以当我们需要把png转jpg格式的时候,就需要用到图片格式转换器,今天推…...
万界星空科技MES系统软件体系架构及应用
MES系统是数字化车间的核心。MES通过数字化生产过程控制,借助自动化和智能化技术手段,实现车间制造控制智能化、生产过程透明化、制造装备数控化和生产信息集成化。生产管理MES系统主要包括车间管理系统、质量管理系统、资源管理系统及数据采集和分析系统…...
uniapp h5实现Excel、Word、PDF文件在线预览,而不是跳转下载,也不需要下载
实现方案 word,微软 Office Web Viewer const url https://view.officeapps.live.com/op/view.aspx?src${encodeURIComponent(https://501351981.github.io/vue-office/examples/dist/static/test-files/test.docx)} window.open(url) //新建窗口打开链接预览 /…...
台式电脑一键重装Win10系统详细教程
很多用户都在使用台式Win10电脑办公,如果电脑出现系统问题无法解决了,这时候就可以考虑给电脑重装系统哦,下面小编给大家详细介绍关于台式电脑一键重装Win10系统的步骤方法,安装后电脑就能恢复正常,也不会影响到用户的…...
图像相机-相机属性SDK汇总设置
文章目录 彩色相机设置彩色分辨率设置(TY_ENUM_IMAGE_MODE)彩色模拟增益(TY_INT_ANALOG_GAIN)彩色曝光(TY_INT_EXPOSURE_TIME)彩色增益彩色畸变 深度相机设置深度分辨率(TY_ENUM_IMAGE_MODE&…...
使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频
1、打开cmd,执行chcp 65001,修改cmd的编码格式为utf8,避免乱码 2、执行指令ffmpeg -list_devices true -f dshow -i dummy,查看当前window的音频和视频名称 3、打开windows系统的"打开声音设置"–“麦克风隐私设置”–"允许应用访问你…...
基于GAM全局注意力机制的YOLOv10多层次特征融合改进:从原理到实践
摘要 在目标检测领域,YOLO系列模型凭借其出色的速度与精度平衡,始终占据着重要地位。然而,传统YOLOv10模型在处理复杂场景下的多尺度目标时,仍存在特征表达能力不足、关键信息丢失等问题。本文提出一种基于GAM(Global Attention Mechanism,全局注意力机制)的YOLOv10改进…...
LiveKit实战:从本地调试到云服务器部署,我的Web视频会议应用上线全记录
LiveKit实战:从本地调试到云服务器部署,我的Web视频会议应用上线全记录 去年夏天,一个在线教育初创团队找到我,希望为他们的教研团队开发一套内部视频会议系统。预算有限但要求不低:需要支持10人以下的高质量音视频通话…...
机器学习必备微积分:核心概念与经典教材推荐
1. 为什么机器学习从业者需要微积分教材当我在2015年第一次尝试理解反向传播算法时,那个下午让我彻底明白了微积分对机器学习的重要性。当时我盯着神经网络权重更新的公式,发现如果不真正理解偏导数和链式法则,就永远只能停留在调包侠的层面。…...
2026年VR交互式展示深度测评:郑州这4家权威推荐避坑指南!
《2026年华中地区企业数字化营销与VR技术应用市场调研报告》数据显示,超过67%的制造企业与地产开发商在寻找VR交互式展示服务商时,因信息不对称而遭遇“视觉落差”或“预算超支”。市场上充斥着炫技噱头,却鲜有服务商能真正理解“设备VR交互式…...
外业人必看:如何把电脑上的CAD图纸快速传到手机,在外业精灵里直接叠加地图做采集?
外业工作者必备:CAD图纸移动化全流程实战指南 站在荒郊野外的测量点上,掏出手机却发现CAD图纸还锁在办公室电脑里——这种场景对测绘、林业、工程等外业工作者来说再熟悉不过。传统工作流中,CAD图纸从设计端到现场端的"最后一公里"…...
【Docker AI沙箱避坑黄金法则】:20年运维专家亲授5大致命陷阱与实时隔离加固方案
更多请点击: https://intelliparadigm.com 第一章:Docker AI沙箱隔离技术的认知重构与本质洞察 传统容器化常被简化为“轻量级虚拟机”,但 Docker 在 AI 工作流中的角色远超进程封装——它正演变为一种**可验证、可审计、可回滚的计算契约载…...
路由选择协议技术
引言 在当今互联互通的网络世界中,数据包如何从源设备高效、准确地到达目的地,离不开路由选择协议的支撑。作为TCP/IP体系架构中的核心组成部分,路由选择协议负责动态维护网络中的路由表,确保数据能够沿着最优路径传输。本文将系统…...
VLOOKUP到XLOOKUP的正确打开方式
先说结论VLOOKUP是Excel里被用得最多也被骂得最多的函数,而XLOOKUP是它的全面升级版,能解决VLOOKUP几乎所有的痛点。如果你还在用VLOOKUP,是时候认识XLOOKUP了。这个东西是什么你一定遇到过这种场景,两张表,一张是员工…...
2026届毕业生推荐的十大降AI率方案推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要想有效避开人工智能文本检测系统的精准辨认,对于生成的内容能够施行如下这一系…...
2025届最火的六大降重复率神器实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek DeepSeek身为智能写作辅助工具,于学术论文撰写里呈现出显著效能,用户…...
