用Java模拟微信红包的实现
用Java模拟微信发红包的实现
大家好,又到了一周一次的分享环节,今天我分享的是模拟微信红包的实现,话不多说,见代码如下:
红包类
public class RedPacket {/**红包ID*/private int id;/**红包金额*/private BigDecimal money;public RedPacket() {}public RedPacket(int id, BigDecimal money) {super();this.id = id;this.money = money;}public int getId() {return id;}public void setId(int id) {this.id = id;}public BigDecimal getMoney() {return money;}public void setMoney(BigDecimal money) {this.money = money;}@Overridepublic String toString() {return id+"号用户获得"+money+"元";}}
红包异常类
public class RedpacketException extends Exception{public RedpacketException() {// TODO Auto-generated constructor stub}public RedpacketException(String msg) {super(msg);}
}
红包功能实现类
public class RedPacketManage {/** 设置每个红包最小金额 */static final BigDecimal MIN = new BigDecimal("0.01");/** @double total 总金额* @int count 红包个数* @return 返回生成的所有红包金额集合*/public static ArrayList<RedPacket> genRedPacket(double total, int count) throws RedpacketException {// 声明临时变量用于存储所有随机的红包对象ArrayList<RedPacket> packets = new ArrayList<RedPacket>();// 计算每个红包分配最低金额一共需要多少钱double min = MIN.multiply(new BigDecimal(count)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();if (min > total) {// 红包金额不够分配时,抛出异常throw new RedpacketException("每个红包金额不能少于0.01元");} else if (min == total) {// 红包金额恰好每人只够分配0.01元,则平均分配for (int i = 0; i < count; i++) {// 创建红包对象RedPacket item = new RedPacket(i + 1, new BigDecimal("0.01"));// 将红包加入集合packets.add(item);}} else {// 当总金额大于每人最少金额之和时,随机分配// 将总金额包装为BigDecimalBigDecimal totalMoney = new BigDecimal(total);//先为每人分配最低金额0.01元for(int i=0;i<count;i++) {packets.add(new RedPacket(i+1, new BigDecimal("0.01")));}//将总金额设置为在原来基础上减去每人最低分配金额totalMoney = totalMoney.subtract(new BigDecimal(min));//声明临时变量统计当前分配的金额总数BigDecimal now = new BigDecimal(0);// 获取每个红包的比例double[] scale = randomScale(count);// 为前count-1个红包分配金额for (int i = 0; i < count - 1; i++) {// 获取当前比例红包需要分配的金额BigDecimal item = totalMoney.multiply(new BigDecimal(scale[i])).setScale(2, BigDecimal.ROUND_HALF_EVEN);//为每人在最低金额基础上增加随机比例金额packets.get(i).setMoney(packets.get(i).getMoney().add(item));//累计已分配金额总数now = now.add(item);}// 剩余的金额给最后一个//获取剩余的金额BigDecimal last = totalMoney.subtract(now);//设置最后一个红包的金额为原来基础上增加剩余的总金额packets.get(count-1).setMoney(packets.get(count-1).getMoney().add(last).setScale(2, BigDecimal.ROUND_HALF_EVEN));}return packets;}/*** 随机红包金额比例* @param count 红包的份数* @return 每份红包的比例数组*/private static double[] randomScale(int count) {// 临时数组存储所有红包的金额比例double[] scale = new double[count];Random r = new Random();double total = 0.0;for (int i = 0; i < count; i++) {// 为每一个元素设置一个1-100随机数scale[i] = r.nextInt(100) + 1;// 累计所有随机的数值total += scale[i];}// 循环计算每个红包的金额比例for (int i = 0; i < count; i++) {scale[i] = scale[i] / total;}return scale;}public static void main(String[] args) throws RedpacketException {ArrayList<RedPacket> list = genRedPacket(0.1, 7);BigDecimal t = new BigDecimal(0);for (RedPacket rp : list) {System.out.println(rp);t= t.add(rp.getMoney());}System.out.println(t);}
}
个人心得
这只是模拟红包的实现,但是还是有很多细节上的功能没有考虑到,只能是部分完成,当然了,我毕竟也只是一个新手嘛,就当是给有需要的人提供点帮助吧。
用Java模拟微信红包的实现相关推荐
- H5模拟微信红包效果
H5模拟微信红包效果 技术:html+css+javascript 效果: 代码: ps:项目代码文件评论区见
- Java模拟微信发红包
作者说: 这个实验运用到了Random类的生成随机数的知识.String类的format方法保留两位小数.灵活运用类型转换. 这次注释写的很详细,因为我做这个实验的时候花了很长时间,我第一次用的方法不 ...
- Java模拟微信发红包,一看就会
自2014年1月26日悄悄上线后,微信红包迅速流行开来,其火爆程度,不亚于此前的"打飞机"小游戏.而收到红包后想要提现,就必须绑定银行卡,这样一来,绑定微信支付的用户数量大增. 先 ...
- java模拟微信抢红包金额算法规则二倍均值法模拟(满满的注释)
二倍均值法模拟微信抢红包金额算法规则 ```java /*** 二倍均值法* @param amount 总金额* @param min 最小金额* @param num 个数* 本帖只提供思路,实际 ...
- 用python语言模拟微信红包_python 模拟微信抢红包 基础语法实现demo
1.实现微信抢红包 简易demo版 : 代码如下: from decimalimport Decimal # 提供了随机方法 import random print('$$$$$$weichat模拟微 ...
- java 开发微信红包
1.接口文档 https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5 2.证书下载及证书安装 首先,商户调用微信红包接口 ...
- 用Java写微信红包实现模拟微信发红包
继承关系如下 题目: 某软件有多名用户(User类),某群聊中有群主(Manager类)和多名普通成员(Member类),现群主大方给成员发红包.红包的规则:群主发一笔金额,从群主余额中扣除,红包分配 ...
- Java模拟微信抢红包
import java.util.Scanner; import java.util.Random;public class RedBags{public static void main(Strin ...
- java调用微信红包接口_java调用微信现金红包接口的心得与体会
这几天看了下以前写的有关微信支付的博客,看的人仍是挺多的,看了下留言不知道是由于博客写的不够细仍是什么状况,大多都找我要源码,我以为吧程序员仍是须要有这么一个思考的过程,所以没直接给源码,俗话说&qu ...
最新文章
- undertale人物_【undertale】传说之下精美人物图包 (Frisk篇)
- Visual Studio 2005 2008 2010样式
- camera(21)---MTK android AF调试总结
- ftk学习记(combox篇)
- sql还原数据库备份数据库_有关数据库备份,还原和恢复SQL面试问题–第三部分
- MyEclipse中使用Junit插件进行单元测试
- Jsoup解析网页html
- MyBatis使用动态SQL语句
- 邮件管理数据库设计--MySQL
- Fragstats 软件安装与下载步骤(附安装包)
- learn opencv-使用OpenCV的自动红眼删除
- 【经济学视频课程】力量F的属性与…
- (转)超全整理!Linux性能分析工具汇总合集
- WPF框架剖析(从头开始自己写WPF框架)
- Android 使用fastboot命令刷机流程
- javascript入门基础篇重点 第二节2.
- IEEE2022/遥感:Stagewise UnsupervisedDomain Adaptation WithAdversarial Self-Training for Road Segmentat
- JSP内置对象及常用方法
- 递推算法之数字三角形求和问题
- Jedis实现抽奖功能