当前位置: 首页 > news >正文

红包算法 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 代码&#xff1a; 和题解思路差不多 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/目录 虚拟文件系统&#xff0c;将内核与进程状态归档为文本文件&#xff08;系统信息都存放这目录下&#xff09; Linux系统上的/proc目录是一种文件系统&#xff0c;即proc文件系统。与其它常见的文件系统不同的是&#xff0c;/proc是一种伪文件系统&#xff08;也即虚拟…...

【组件自定义事件+全局事件总线+消息订阅与发布+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案例——消息的订阅与…...

单独封装export default .js 在引入

...

【带头学C++】----- 三、指针章 ---- 3.11 补充重要指针知识(二,拓展基础知识)

1.指针与函数 1.1指针变量作为函数的参数 如果想在函数内部修改外部变量的值&#xff0c;可以将外部变量的地址传递给函数。 在C/C中&#xff0c;函数的参数传递方式有值传递&#xff08;传递变量的副本&#xff09;和引用传递&#xff08;传递变量的地址&#xff09;。如果希…...

Jmeter分布式性能测试细节+常见问题解决,资深老鸟带你避坑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 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"用户名称…...

短路表达式

什么是短路表达式 作为"&&"和"||"操作符的操作数表达式&#xff0c;这些表达式在进行求值时&#xff0c;只要最终的结果已经可以确定是真或假&#xff0c;求值过程便告终止&#xff0c;这称之为短路求值。这是这两个操作符的一个重要属性。 而在j…...

风力发电场集中监控系统解决方案

安科瑞 崔丽洁 作为清洁能源之一&#xff0c;风力发电场近几年装机容量快速增长。8月17日&#xff0c;国家能源局发布1-7月份全国电力工业统计数据。截至7月底&#xff0c;全国累计发电装机容量约27.4亿千瓦&#xff0c;同比增长11.5%。其中&#xff0c;太阳能发电装机容量约4.…...

SpringDataJpa(二)

三、Spring Data JPA概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架&#xff0c;可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能&#xff0c;且易于扩展&#xff01;学习并使用 Spring D…...

软件测评中心▏软件功能测试和非功能测试的区别和联系简析

在软件开发的过程中&#xff0c;功能测试和非功能测试是两个重要的环节。功能测试是指对软件的各项功能进行验证和确认&#xff0c;关注软件是否按照需求规格说明书进行了实现&#xff0c;是否满足了用户的功能需求。而非功能测试是指对软件的性能、可靠性、安全性等方面进行测…...

打卡系统有什么用?如何通过日常管理系统提高企业员工的效率?

在当今快速发展的时代&#xff0c;职工的行动管理已成为机构单位工作中至关重要的一环。如何更好地了解和掌握职工的日程安排和行动轨迹&#xff0c;成为了一个值得探讨的问题。为了解决这一难题&#xff0c;“的修”打卡系统应运而生&#xff0c;它为我们提供了一个全面而高效…...

png怎么转jpg?这款图片转格式工具一学就会用

虽然png图片格式是一种无损压缩格式&#xff0c;但是png图片的内存大小也是比较大的&#xff0c;而且兼容性上也没有jpg图片好&#xff0c;许多平台推荐的也都是jpg格式&#xff0c;所以当我们需要把png转jpg格式的时候&#xff0c;就需要用到图片格式转换器&#xff0c;今天推…...

万界星空科技MES系统软件体系架构及应用

MES系统是数字化车间的核心。MES通过数字化生产过程控制&#xff0c;借助自动化和智能化技术手段&#xff0c;实现车间制造控制智能化、生产过程透明化、制造装备数控化和生产信息集成化。生产管理MES系统主要包括车间管理系统、质量管理系统、资源管理系统及数据采集和分析系统…...

uniapp h5实现Excel、Word、PDF文件在线预览,而不是跳转下载,也不需要下载

实现方案 word&#xff0c;微软 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电脑办公&#xff0c;如果电脑出现系统问题无法解决了&#xff0c;这时候就可以考虑给电脑重装系统哦&#xff0c;下面小编给大家详细介绍关于台式电脑一键重装Win10系统的步骤方法&#xff0c;安装后电脑就能恢复正常&#xff0c;也不会影响到用户的…...

图像相机-相机属性SDK汇总设置

文章目录 彩色相机设置彩色分辨率设置&#xff08;TY_ENUM_IMAGE_MODE&#xff09;彩色模拟增益&#xff08;TY_INT_ANALOG_GAIN&#xff09;彩色曝光&#xff08;TY_INT_EXPOSURE_TIME&#xff09;彩色增益彩色畸变 深度相机设置深度分辨率&#xff08;TY_ENUM_IMAGE_MODE&…...

使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

1、打开cmd&#xff0c;执行chcp 65001,修改cmd的编码格式为utf8&#xff0c;避免乱码 2、执行指令ffmpeg -list_devices true -f dshow -i dummy,查看当前window的音频和视频名称 3、打开windows系统的"打开声音设置"–“麦克风隐私设置”–"允许应用访问你…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...