java 红包规则

java 红包规则

拼手气红包:

规则:最大金额:全部金额/个数*倍数

最小金额:0.01

最后一个红包是全部金额-领取金额

随机分配

package com.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * 红包分发工具类
 *
 */
public class CashRedPackUtils {
    /**
     * 一个红包最少拆分数量
     */
    public static final int REDPACK_MIN_QUANTITY = 1;
    /**
     * 一个红包最多拆分数量
     */
    public static final int REDPACK_MAX_QUANTITY = 100;
    /**
     * 小数位长度
     */
    private static final int SCALE = 2;
    /**
     * 舍弃的小数位处理方式
     */
    private static final RoundingMode ROUNDING_MODE = RoundingMode.HALF_EVEN;
    /**
     * 红包放大倍数
     */
    private static final BigDecimal TIMES = new BigDecimal("3");
    /**
     * 单个红包最小金额
     */
    public static final BigDecimal SINGLE_RED_MIN_MONEY = new BigDecimal("0.01");
    /**
     * 单个红包最大金额
     */
//    private static final BigDecimal SINGLE_RED_MAX_MONEY = new BigDecimal("100");
    /**
     * 递归计算红包金额时连续错误最大值,超过此次数将返回最小值
     */
    private static final int ERROR_MAX_NUM = 5;
    /**
     * 递归计算红包金额连续错误次数初始值
     */
    private static final int ERROR_INIT_NUM = 1;
    /**
     * 计算金额时的小数位,1000代表3位小数
     */
    private static final int FRACTION_LENGTH = 1000;
    
    /**
     * 分发红包
     * @param redMoney 红包总金额
     * @param num 红包数量
     * @return
     */
    public static List<BigDecimal> SplitRedPackes(BigDecimal redMoney, int num) {
        List<BigDecimal> redInfoList = new ArrayList<>();
    // 红包有误

    if(num < REDPACK_MIN_QUANTITY || num > REDPACK_MAX_QUANTITY)
       return redInfoList;

    //校验:金额大于0 if(redMoney.compareTo(BigDecimal.ZERO) != 1) { return redInfoList; } if(num <= 1) { redInfoList.add(redMoney); return redInfoList; } Random random = new Random(); for(int i = 0; i < num; i++) { // System.out.println("\n" + (i+1) + "个红包信息:"); int surplusNum = num - i;//未分配金额红包数量 BigDecimal curRedMoney = fightLuckRedPacked(redMoney, surplusNum, random, ERROR_INIT_NUM); redInfoList.add(curRedMoney); redMoney = redMoney.subtract(curRedMoney); // MandoAssert.notTrue(redMoney.compareTo(BigDecimal.ZERO) == -1, "红包金额有误"); // System.out.println("红包金额:" + curRedMoney + ",剩余:" + redMoney); } return redInfoList; } /** * 拼手气红包 * @param redMoney 红包金额 * @param num 红包数量 * @param random 随机数生成对象 * @param errorNum 错误测试 * @return 单个红包金额 */ private static BigDecimal fightLuckRedPacked(BigDecimal redMoney, int num, Random random, int errorNum) { if(num <= 1) { return redMoney; } if(errorNum > ERROR_MAX_NUM) { //随机金额产生错误次数超过上限,返回最小值 return SINGLE_RED_MIN_MONEY; } //每个红包最大金额 = 剩余总金额 / 未分配金额红包数量 * 红包放大倍数 int avgRedMaxMoney = redMoney.divide(new BigDecimal(num), ROUNDING_MODE).multiply(TIMES).intValue() * FRACTION_LENGTH; BigDecimal curRedMoney = new BigDecimal(random.nextInt(avgRedMaxMoney) * 1.00 / FRACTION_LENGTH + "").setScale(SCALE, ROUNDING_MODE); if(curRedMoney.compareTo(SINGLE_RED_MIN_MONEY) == -1) { //红包最小值判断:小于最小红包金额,重新计算 return fightLuckRedPacked(redMoney, num, random, ++errorNum); } /*if(curRedMoney.compareTo(SINGLE_RED_MAX_MONEY) == 1) { //红包最大值判断 return fightLuckRedPacked(curRedMoney, num, random, ++errorNum); }*/ //最少保留红包金额 BigDecimal surplusMinRedMoney = SINGLE_RED_MIN_MONEY.multiply(new BigDecimal(num - 1)); //除当前红包剩余金额 BigDecimal surplusRedMoney = redMoney.subtract(curRedMoney); if(surplusMinRedMoney.compareTo(surplusRedMoney) == 1) { return fightLuckRedPacked(redMoney, num, random, ++errorNum); } return curRedMoney; } public static void main(String[] args) { System.out.println(SplitRedPackes(new BigDecimal("100"), 20)); } }

 

转载于:https://www.cnblogs.com/chenyq/p/6293937.html

微信红包支付--发放普通红包 发放规则 普通红包:一次只发给一个用户 注:红包金额大于200时,请求参数scene_id必传(使用的场景需在商户平台--产品中心--现金红包--产品设置中设置,设置金额的有效期为一个月,下面程序用到的场景id为PRODUCT_5:渠道分润,该场景的金额最大设置值为4999) 接口调用请求说明 请求参数 数据示例: 接口详 阅读详情

相关推荐

微信抢红包架构实现

概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量。 微信的金额什么时候算? 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。。 采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。 实...

360

拼手气红包如何设计?

微信是我们日常生活中必不可少的聊天工具,里面的红包功能我们也经常使用,其中,拼手气红包有时候可以抢到很大,有时候就只有0.01,那这个功能应该是如何实现的呢?

weixin_44267758的博客 2864

微信拼手气红包探秘

大约2周前,孩子学校组织“学校数学智慧节——做数学研究”活动,我们选了一个主题:怎样才能抢到更大的红包

weixin_42906161的博客 1万+

解析拼手气红包金额划分算法

“叮咚”,微信提示音响起,打开手机发现“相亲相爱一家人”的群里又收到一个红包,天不负我,这一次终于抢到的金额终于说得过去了,虽然不是“运气王”,但有时候做个榜二也是一件很幸福的事情。 ###由红包引发的思考 红包的金额是如何划分的?红包的金额是怎么实现的完全随机呢? ###问题抽象 将M元(M可以是两位数小数)的红包完全随机划分,最小分割单位为0.01元,分割成N份,且需要保证每人最少可领取...

忘忧的博客 1万+

拼手气红包生成方式——Java

相信大家应该都参与过微信的拼手气红包吧,那运气王是先抢的概率大还是后抢的概率大呢?我们一起来看一下拼手气红包的生成方式——随机分配红包。生成拼手气红包的逻辑就是将已知的总金额和总数量进行随机分配值的过程,那这个过程中需要注意下面这三个规则:随机分配红包金额时一般需要遵循3个规则:(1)所有人抢到金额之和等于红包总金额,不能超过,也不能少于;(2)抢到的红包金额至少是一分钱;(3)要保证抢到红包的人获取到的红包金额是随机的。

Mr_likes的博客 1207

红包 java_java 红包规则

List redInfoList = new ArrayList<>();// 红包有误if(num < REDPACK_MIN_QUANTITY || num > REDPACK_MAX_QUANTITY)returnredInfoList;//校验:金额大于0if(redMoney.compareTo(BigDecimal.ZERO) != 1) {returnredI...

weixin_42198780的博客 203

Java红包退款_java 红包规则

List redInfoList = new ArrayList<>();// 红包有误if(num < REDPACK_MIN_QUANTITY || num > REDPACK_MAX_QUANTITY)returnredInfoList;//校验:金额大于0if(redMoney.compareTo(BigDecimal.ZERO) != 1) {returnredI...

weixin_36453621的博客 298

Java 随机红包、平均红包分配规则

package com.rsfy.utils; import java.util.ArrayList; import java.util.List; /** * 红包分配规则 * * @author houzh * */ public class RedPacketUtils { // 最小红包额度 private static final int MINMONEY = 1;...

侯正海 3295

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。

小鸡慢慢的专栏 1万+

Java实现仿微信红包分配规则

这篇文章主要为大家详细介绍了Java实现仿微信红包分配规则,介绍一种随机红包分配策略,感兴趣的小伙伴们可以参考一下 最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制       对于微信红包,我们知道没人随机的最小红包是1分,最大金额是

Miss_Wangcl的博客 775

java模拟微信抢红包金额算法规则二倍均值法模拟(满满的注释)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_43806688的博客 828

红包抽奖java源码_JAVA实现简单抢红包算法(模拟真实抢红包)

闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额。我就自己稍微计算了一下如果有限额该怎么写。觉得这样与微信红包差不多。等项目需求完成以后。正好来博客贴一下我自己写的拆红包算法。个人觉得这个算法比较模拟现实抢红包规则。废话少说。先贴代码;import java.math.BigDecimal;import java.util.ArrayList;import java.util.Col...

weixin_28944739的博客 479

微信公众平台开发之现金红包Java

微信公众平台,微信现金红包,现金红包java

xiejiawanwei2_bb的专栏 1万+

java 实现微信抢红包Dome

java 实现微信抢红包Dome 红包的一些规则和算法,如下(随机拆分玩法): 1.每个红包金额不能小于0.01元 2.如果发送5个红包,则红包总金额不能小于0.01*5=0.05元 3.如果红包的个数大于1个,则每个红包的拆分金额不能等于红包总金额 4.每个红包拆分的金额之和,等于红包的总金额 5.要随机拆分,并且是没有任何顺序 6.显示运气王 抢红包逻辑代码 public class ...

tt336798的博客 3185

MarsCode刷题--49红包运气排行榜

小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。

wlove520的博客 252
上一篇: Java开发必会的Linux命令
下一篇: java 等额本金与等额本息
Harding2016
博客等级 码龄11年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值