# 微信红包生成算法的实现

3 篇文章 0 订阅

## 微信红包生成算法的实现

### 一、微信红包算法

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 RedPacketExcption{
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
BigDecimal money = new BigDecimal("0.01");
//获取总金额的最小值
double minMoney = money.multiply(new BigDecimal(count)).doubleValue();
BigDecimal totalMoney = new BigDecimal(sumMoney);
//判断金额的最小值是否超过了总金额
if(minMoney > totalMoney.doubleValue()) {
throw new RedPacketExcption("每个红包不能少于0.01元");
}
if(minMoney == totalMoney.doubleValue()) {
//最低金额正好等于总金额(平均分配)
for (int i = 0; i < count; i++) {
}
return list;
}
double total = 0;
//总金额超过没人最低金额
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);
//将金额加入集合
//累计已经分配的金额总值
}
//将剩余的金额装入集合
return list;
}

/**
* 随机生成比例，假设一共5人:
* 0.2,0.1,0.3,0.1,0.3
* @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 RedPacketExcption {
ArrayList<BigDecimal> list = new RedPacket("10", 5).genPacket();

for (BigDecimal bd : list) {
System.out.print(bd+"元\t");
}
System.out.println();
}
}


### 二、设计思路

1、每个人分的的红包数概率随机
2、每个人的红包数金额之和必须等于红包总金额数
3、每人最少金额为0.01元

ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
BigDecimal money = new BigDecimal("0.01");
//获取总金额的最小值
double minMoney = money.multiply(new BigDecimal(count)).doubleValue();
BigDecimal totalMoney = new BigDecimal(sumMoney);
//判断金额的最小值是否超过了总金额
if(minMoney > totalMoney.doubleValue()) {
throw new RedPacketExcption("每个红包不能少于0.01元");
}
if(minMoney == totalMoney.doubleValue()) {
//最低金额正好等于总金额(平均分配)
for (int i = 0; i < count; i++) {
}
return list;
}


/**
* 随机生成比例，假设一共5人:
* 0.2,0.1,0.3,0.1,0.3
* @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;
}

double total = 0;
//总金额超过没人最低金额
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);
//将金额加入集合
//累计已经分配的金额总值
}
//将剩余的金额装入集合
return list;


### 三、调试程序

public static void main(String[] args) throws RedPacketExcption {
ArrayList<BigDecimal> list = new RedPacket("10", 5).genPacket();

for (BigDecimal bd : list) {
System.out.print(bd+"元\t");
}
System.out.println();
}


• 1
点赞
• 2
收藏
觉得还不错? 一键收藏
• 1
评论
03-03 297
07-06 425
04-01 1847
01-22 5689
08-01 374
04-01 2791
08-31
09-22
10-21
04-12 339
04-14 533
04-13 518
04-11 936
04-15 274

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

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