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));
}
}

posted on 2024-12-05 13:46  梓木的稻稻  阅读(50)  评论(0)    收藏  举报