参考文章:

微信红包算法分析:https://ld246.com/article/1478364657122

微信红包的架构设计简介——原文:https://www.zybuluo.com/yulin718/note/93148

知乎答案:来自@陈鹏 知乎链接:https://www.zhihu.com/question/22625187/answer/85530416

下面的代码是基于上述几篇文章综合版本

Java代码模拟

public class RedPackageTest {/*** 规则:* 1.每个用户至少能获得0.01元* 2.红包抢到的额度范围在:{0.01,剩余平均值*2}之间* eg: 100块钱,10个红包,平均值是10块钱,红包额度在{0.01,20}之间* 当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。*/public static BigDecimal getRandomMoney(RedPack redPackageObject) {if (redPackageObject.leftNum == 1) {redPackageObject.leftNum--;return redPackageObject.leftMoney;}BigDecimal random = BigDecimal.valueOf(Math.random());// 红包最小金额0.01,每个人至少能拿到0.01BigDecimal min = BigDecimal.valueOf(0.01);// 红包均值BigDecimal average = redPackageObject.leftMoney.divide(BigDecimal.valueOf(redPackageObject.leftNum), BigDecimal.ROUND_DOWN);// 红包均值乘以2BigDecimal max1 = average.multiply(new BigDecimal(2));// 剩下的每个人至少有0.01,即要保证每个人能拿到0.01元红包BigDecimal minLeftMoney = min.multiply(BigDecimal.valueOf(redPackageObject.leftNum - 1));BigDecimal max2 = redPackageObject.leftMoney.subtract(minLeftMoney);BigDecimal max = (max1.compareTo(max2) < 0) ? max1 : max2;BigDecimal money = max.multiply(random).setScale(2, BigDecimal.ROUND_DOWN);money = money.compareTo(min) < 0 ? min : money;redPackageObject.leftNum--;redPackageObject.leftMoney = redPackageObject.leftMoney.subtract(money);return money;}static class RedPack {/*** 剩余的红包数量*/private int leftNum;/*** 剩余的金额,微信红包最多两位小数*/private BigDecimal leftMoney;public RedPack(int leftNum, String leftMoney) {this.leftNum = leftNum;this.leftMoney = new BigDecimal(leftMoney);if (!isWeChatRedPackage(this.leftMoney)) {throw new IllegalArgumentException("微信红包最多两位小数,且不超过200");}}}/*** 判断是否是微信红包,至多2位整数(不超过200),2位小数*/public static boolean isWeChatRedPackage(BigDecimal num) {int signum = num.signum();int scale = num.stripTrailingZeros().scale();// 微信红包必须为正整数,且小数位不能超过2位if (signum != 1 || scale > 2) {return false;}// 微信红包不能超过200if (num.compareTo(new BigDecimal("200")) > 0) {return false;}return true;}public static void main(String[] args) {RedPack moneyPackage = new RedPack(5, "200.00");while (moneyPackage.leftNum != 0) {System.out.print(getRandomMoney(moneyPackage) + "   ");}System.out.println();}
}

微信红包Java模拟实现相关推荐

  1. 微信红包JAVA代码整理

    一.红包接口调用服务类: package cn.com.wechat.act.core.service; import java.io.File; import java.io.FileInputSt ...

  2. java微信红包_Java模拟微信发红包(普通红包、拼手气红包)

    假设红包总额M元,分给N个人. 满足条件: 如果是普通红包,每个人获得的金额都一样: 如果是拼手气红包,则有所区别,但不能金额过于离谱,比如第一个获得的太多,以至于后来的人都几乎没得分. 注意点: 1 ...

  3. 用Java写微信红包实现模拟微信发红包

    继承关系如下 题目: 某软件有多名用户(User类),某群聊中有群主(Manager类)和多名普通成员(Member类),现群主大方给成员发红包.红包的规则:群主发一笔金额,从群主余额中扣除,红包分配 ...

  4. 用python语言模拟微信红包_python 模拟微信抢红包 基础语法实现demo

    1.实现微信抢红包 简易demo版 : 代码如下: from decimalimport Decimal # 提供了随机方法 import random print('$$$$$$weichat模拟微 ...

  5. 微信红包 java_微信支付-微信红包Java版本

    https://zb.oschina.net/market/opus/1325c0ab3ac1f4b6 代码链接,可根据需求出方案与代码. 需要有认证的公众号,且开通了微信支付,商户平台且开通了现金红 ...

  6. QQ2 微信红包java

    描述 春节期间小明使用微信收到很多个红包,非常开心.在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半.请帮小明找到该红包金额.写出具体算法思路和代码实现,要求算法尽可能高效. 给定 ...

  7. 前端实现红包雨功能_最全解密微信红包随机算法(含代码实现)

    code小生 一个专注大前端领域的技术平台公众号回复 Android加入安卓技术群 "  1.引言 这个系列文章已经整理了10篇,但都没有涉及到具体的红包算法实现,主要有以下两方面原因.一方 ...

  8. 最全解密微信红包随机算法(含代码实现)

    code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 " 本文内容编写时,参考了网上的资料,详见"参考资料"部分,感谢分享者..本文已同步发 ...

  9. 用Java模拟微信红包的实现

    用Java模拟微信发红包的实现 大家好,又到了一周一次的分享环节,今天我分享的是模拟微信红包的实现,话不多说,见代码如下: 红包类 public class RedPacket {/**红包ID*/p ...

最新文章

  1. 【计算机网络】Session机制
  2. 设计模式理解(二)创建型——单例、原型
  3. 指尖上的艺术——如何运用代码发挥无限创意
  4. php多图片上传到数组,input type=file多图片上传 原生html传递的数组集合
  5. java class object_[java]Class类和Object类的关系
  6. 硬核干货!揭秘波士顿动力背后的专利技术
  7. 瑞斯康达nms_瑞斯康达接入网设备维护标准手册.docx
  8. Android Navigation 详解
  9. 【Unity】Unity3D RPG游戏制作实例(二)开发思路及概要设计
  10. 耗时一个月,总结的Linux C++后台开发学习路线(已签腾讯sp,附学习资料)
  11. 题解 P1340 【兽径管理】
  12. java 替换 ppt内容_Java 替换PPT中的指定文本内容 详细始末
  13. 计算机链接投影仪后不显示桌面,win10系统连接投影后不显示桌面图标怎么办
  14. 简单粗暴识别工作室Android识别模拟器
  15. OCR图片转文字两种python方法实现
  16. 关于Scaner和BufferReader
  17. document的用法
  18. v-loading的使用(ElementUI)
  19. Codeforces ~ 1063C ~ Dwarves, Hats and Extrasensory Abilities (交互题,二分)
  20. 江苏自考计算机专业2020,2020年4月江苏自考A2080702计算机及应用考试安排(本科)...

热门文章

  1. 安卓ps模拟器_在电脑里玩手机—[多屏协同]虫洞支持安卓和iOS
  2. 在Windows10安装和使用机器人操作系统ROS补充说明
  3. 营销狂人杜国楹的两大顶级思维
  4. Echarts自动轮播插件echarts-auto-tooltip的使用(附停止轮播的方法)
  5. oracle时间判断上下午,oracle查询时间的判断
  6. 最佳iOS设备管理器imazing 2.16.9官网Mac/Windows下载电脑版怎么下载安装
  7. 5、Redis高级特性(慢查询、Pipeline、事务、Lua)
  8. 关于uni-app的webview
  9. 微信小程序——通讯录索引实现
  10. 大量ACM/ICPC书籍与网站资源