1、红包金额（最小精确到厘：0.001，数据库是用int表示，1元也就是1000厘）
2、红包发放数量
3、红包金额上限
4、红包金额下限
5、金额精度（精度可以理解为随机数能精确到小数哪一位，如范围为：0.01~0.5，如果精确到分的随机数为0.34 or 0.340，如果精确到厘：0.345）

1,2,3,4,5都可以由用户输入或选择，程序可进行判断是否参数不符计算，意思就是：

3个回答

`````` public class Red {
private int remain;//金额，单位厘
private int count;//个数
private Precision precision;//精度
private int max;//上限，单位厘
private int min;//下限，单位厘
private int[] redPool;
private int index;

public static void main(String[] args) {
int count = 100;
Red red = Red.newInstance(10 * 1000, count, Precision.FEN, 1 * 1000, 5 * Precision.FEN.getPre());
int sum = 0;
for (int i = 0; i < count; i++) {
int money = red.getRed();
sum += money;
System.out.println(money);
}
System.out.println("---------------" + sum);
}

public int getRed() {
return index < count ? redPool[index++] : 0;
}

public static Red newInstance(int money, int count, Precision precision, int max, int min) {
Red red = new Red(money, count, precision, max, min);
String msg;
if ("".equals(msg = red.validate())) return red;
else throw new RuntimeException(msg);
}

private Red(int money, int count, Precision precision, int max, int min) {
this.remain = money;
this.count = count;
this.precision = precision;
this.max = max;
this.min = min;
init();
}

private void init() {
redPool = new int[count];
int remain_ = remain;
for (int i = 0; i < count - 1; i++) {
int max = getRealMax(remain_, count - i);
int min = getRealMin(remain_, count - i);
int money = ((int)(Math.random() * (max - min + precision.getPre())) + min)
/ precision.getPre() * precision.getPre();//[min, realMax]
remain_ -= money;
redPool[i] = money;
}
redPool[count - 1] = remain_;
randomPool();
}

private void randomPool() {
for (int i = 0; i < count; i++) {
int index = (int) (Math.random() * count);
int temp = redPool[i];
redPool[i] = redPool[index];
redPool[index] = temp;
}
}

private int getRealMax(int remain, int count) {
int calMax = remain - ((count - 1) * min);
return Math.min(calMax, max);
}

private int getRealMin(int remain, int count) {
int calMin = remain - ((count - 1) * max);
return Math.max(calMin, min);
}

public int getRemain() {
return remain;
}

public void setRemain(int remain) {
this.remain = remain;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}

public int getMax() {
return max;
}

public void setMax(int max) {
this.max = max;
}

public int getMin() {
return min;
}

public void setMin(int min) {
this.min = min;
}

public Precision getPrecision() {
return precision;
}

public void setPrecision(Precision precision) {
this.precision = precision;
}

private String validate() {
String msg = "";
if (remain <= 0) {
msg = "余额不能为0";
} else if (remain % precision.getPre() != 0) {
msg = "余额的精度不对";
} else if (count <= 0) {
msg = "红包个数必须为正数";
} else if (max % precision.getPre() != 0) {
msg = "上限的精度不对";
} else if (max <= min) {
msg = "上限必须大于下限";
} else if (min % precision.getPre() != 0) {
msg = "下限的精度不对";
} else if (min <= 0) {
msg = "下限必须大于0";
} else if (getRealMax(remain, count) < getRealMin(remain, count)) {
msg = "上下限设置错误";
}
return msg;
}

}
enum Precision {
LI(1),
FEN(10),
JIAO(100),
YUAN(1000);

private int pre;
private Precision(int pre) {
this.pre = pre;
}
public int getPre() {
return pre;
}
}
``````

1.生成个9999以内的随机数 比如说生成5300 计数1
2.10000-5300 = 4700 再次生成一个4700内的随机数 计数+1
3.依次类推 最后到9次的时候 使用10000-生成所有随机数之和这样就生成最后一个金额

Java 实现微信红包分配算法

Java实现红包随机分配算法

java实现微信红包分配算法

QQ红包金额分配算法

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

package com.common; import java.util.ArrayList; import java.util.HashSet; import java.util.List; public class HongBaoUtil {     /**      * 1.总金额不能超过500000000 单位是积分      * 2.每个红包都要有积分，最低不能低于500分，最大金...

Java: 微信红包分配实现

Java红包算法 有完整的代码及逻辑分析 大家可以参考
Java 分红包算法

Java 实现红包算法

QQ红包随机分配

java实现红包随机分配金额
import java.util.Random; class Scratch {     public static void main(String[] args) {         int count = 5;/个数         double amount = 200;/金额         double singleMin = 0.01;//单个红包最小金额         doub...
JAVA实现仿微信红包分配规则

java实现微信红包分配改进

java 分配算法

\$this = rand(1,\$all-\$num+1); \$all -= \$this; \$num —;
JAVA版的微信红包算法

Java权重分配的实现算法

php固定红包 + 随机红包算法
1 需求 CleverCode最近接到一个需求，需要写一个固定红包 + 随机红包算法。 1 固定红包就是每个红包金额一样，有多少个就发多少个固定红包金额就行。 2 随机红包的需求是。比如红包总金额5元，需要发10个红包。随机范围是 0.01到0.99；5元必需发完，金额需要有一定趋势的正态分布。（0.99可以任意指定，也可以是 avg * 2 - 0.01；比如avg = 5 / 10 =

/**  * 红包算法  * @author admin  *  */ public class RedPacket {          //最新金额     private static final int MIN_MONEY=1;          //最大金额     private static final int MAX_MONEY=20000;          //最大的红包是平均...

［算法］微信红包

php红包算法
PHP红包面试必备，囊括市场最经典的，希望大家能用得上

private final AtomicLong seed; private static final long multiplier = 0x5DEECE66DL; private static final long addend = 0xBL; private static final long mask = (1L << 48) - 1; /**

/** * * @param total * 红包总额 * @param count * 红包个数 * @param max * 每个小红包的最大额 * @param min * 每个小红包的最小额