package com.xincai.api.forum.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @author: tranquil_chen
* @Time: 2024/3/5 8:40
* @description: 红包随机金额生成算法
*/
public class RedPacketUtil {
/**
* 分红包算法:二倍均值法
* @param totalAmount 红包总金额,单位为分
* @param totalPeopleNum 总人数
* @return 随机金额数组
*/
public static List<Double> splitRedpacket(Double totalAmount, Double totalPeopleNum) {
List<Double> amountList = new ArrayList<Double>();
if (totalAmount>0 && totalPeopleNum>0){
Double restAmount = totalAmount * 100;
Double restPeopleNum = totalPeopleNum;
Random random = new Random();
for (int i = 0; i < totalPeopleNum - 1; i++) {
// 随机范围:[1,剩余人均金额的两倍),左闭右开
double amount = random.nextInt((int) (restAmount / restPeopleNum * 2 - 1)) + 1;
restAmount -= amount;
restPeopleNum--;
amountList.add(amount/100);
}
amountList.add(restAmount/100);
}
return amountList;
}
/**
* 二倍均值法
*/
public static List<BigDecimal> splitRedpacket(BigDecimal amount, BigDecimal min , BigDecimal num){
List<BigDecimal> redMoneyList = new ArrayList<>();
BigDecimal remain = amount.subtract(min.multiply(num));
final Random random = new Random();
final BigDecimal hundred = new BigDecimal("100");
final BigDecimal two = new BigDecimal("2");
BigDecimal sum = BigDecimal.ZERO;
BigDecimal redpeck ;
BigDecimal finalMoney = new BigDecimal(0);
for (int i = 0; i < num.intValue(); i++) {
final int nextInt = random.nextInt(100);
if(i == num.intValue() -1){
redpeck = remain;
}else{
redpeck = new BigDecimal(nextInt).multiply(remain.multiply(two).divide(num.subtract(new BigDecimal(i)),2, RoundingMode.CEILING)).divide(hundred,2, RoundingMode.FLOOR);
}
if(remain.compareTo(redpeck) > 0){
remain = remain.subtract(redpeck);
}else{
remain = BigDecimal.ZERO;
}
if (i == num.intValue() -1) {
finalMoney = amount.subtract(sum);
} else {
finalMoney = min.add(redpeck).setScale(2, RoundingMode.DOWN);
}
sum = sum.add(finalMoney);
redMoneyList.add(finalMoney);
}
return redMoneyList;
}
public static void main(String[] args) {
splitRedpacket(new BigDecimal(10),new BigDecimal(0.1),new BigDecimal(6));
}
}