模拟QQ/微信红包算法(基于BigDecimal、DecimalFormat、Random类)
2020-07-05 14:30
387 查看
基于BigDecimal、DecimalFormat、Random实现模拟红包算法
RedPacket 类
import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Random; public class RedPacket { /**总金额*/ private String sumMoney; /**红包总数*/ private int count; private Random r = new Random(); public RedPacket(String sumMoney, int count) { super(); this.sumMoney = sumMoney; this.count = count; } public ArrayList<BigDecimal> genPacket() throws RedPacketException{ ArrayList<BigDecimal> list = new ArrayList<>(); BigDecimal money = new BigDecimal("0.01"); //获取总金额的最小值 double minMoney = money.multiply(new BigDecimal(count)).doubleValue(); //将字符串类型的金额包装为BigDecimal BigDecimal totalMoney = new BigDecimal(sumMoney); //判断红包总金额是否大于红包最小值(判断总金额是否够分) if(minMoney > totalMoney.doubleValue()){ throw new RedPacketException("每个红包不能少于0.01元"); } if(minMoney == totalMoney.doubleValue()) { //最低金额正好等于总金额(每人0.01) for(int i = 0 ; i < count ; i++) { list.add(new BigDecimal("0.01")); } return list; } double[] scales = randomScale(); //合计已经分配多少钱 BigDecimal sends = new BigDecimal("0"); for(int i = 0; i < scales.length-1 ; i++) { //根据比例计算每个红包的应分得的金额 money = totalMoney.multiply(new BigDecimal(scales[i])).setScale(2, BigDecimal.ROUND_HALF_EVEN); sends = sends.add(money); list.add(money); } list.add(totalMoney.subtract(sends)); return list; } /** * 随机生成比例。假设一共5人: * 0.2,0.1,0.3,0.3,0.1 * @return */ public double[] randomScale() { //累计总随机值 double total = 0; //临时数组存储每个红包的随机比例 double[] scales = new double[count]; for (int i = 0; i < count; i++) { //随机获取一个从1-100的整数 int rint = r.nextInt(100)+1; scales[i] = rint; total += rint; } //计算比例 for (int i = 0; i < count; i++) { scales[i] = scales[i] / total; } return scales; } public static void main(String[] args) throws RedPacketException { ArrayList<BigDecimal> list = new RedPacket("10", 5).genPacket(); for (BigDecimal bd : list) { System.out.print(bd + "元\t"); } } }
自定义异常 RedPacketException类
public class RedPacketException extends Exception{ public RedPacketException() { // TODO Auto-generated constructor stub } public RedPacketException(String message) { super(message); } }
相关文章推荐
- 基于PHP微信红包的算法探讨
- Java模拟微信红包分配算法
- 基于PHP微信红包的算法探讨
- 微信红包的算法实现探讨(基于PHP)
- 微信红包的算法实现探讨(基于PHP)
- Android微信/QQ红包自动抢(AccessibilityService)
- 揭秘微信红包:架构、抢红包算法、高并发和降级方案
- 红包 支付宝 微信 qq
- 微信红包的算法实现
- Android之旅:Android 与 unity3d 基于微信授权、支付、分享,QQ分享,支付宝支付的交互
- 微信红包算法研究
- 基于JavaEE——微信网页(四)微信的程序接入 (代码--模拟示例)
- 浅谈微信红包的算法
- Python版微信红包分配算法
- 基于微信红包插件的原理实现android任何APP自动发送评论(已开源)
- 微信红包算法遐想
- 微信红包算法
- 基于三级反馈队列调度算法的UNIX进程管理程序模拟
- 微信扫一扫背后的秘密:基于运动估计的智能传图算法
- 数字类 DecimalFormat 和 BigDecimal 和 random 随机数