需求:红包总金额随机后每份金额:最大值200, 最小值0.01;最大份数100;
工具:idea
参考:微信红包算法以及带上下限的红包算法
基于微信红包算法以及带上下限的红包算法优化,修改了部分极值时,报错的问题,例如0.03元的红包分为2份。
import com.alibaba.fastjson.JSON;
import org.junit.Assert;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
/**
* 参考:https://blog.csdn.net/paincupid/article/details/82054647
* @author crossoverJie
* Date: 03/01/2018 16:52
* @since JDK 1.8
*/
public class RedPacketTools {
public static BigDecimal MONEY_1_100 = new BigDecimal("0.01");
public static final BigDecimal TIMES_100 = new BigDecimal(100);
public static BigDecimal MONEY_200 = new BigDecimal(200);
private static final Random random = new Random();
/**
* 红包随机算法(分和元转换)
* @param money 红包总金额,单位为元
* @param count 红包份数
* @return 返回值的金额单位为元
*/
public static List createBonusList(BigDecimal money, int count) {
List moneys = new ArrayList<>(count);
int _money = money.multiply(TIMES_100).intValue();
int rdMin = MONEY_1_100.multiply(TIMES_100).intValue();
int rdMax = MONEY_200.multiply(TIMES_100).intValue();
int[] _moneys = createBonusList(_money, count, rdMin, rdMax, 0.8);
for (int m: _moneys) {
moneys.add(new BigDecimal(m).divide(TIMES_100));
}
return moneys;
}
/**
* 返回一次抽奖在指定中奖概率下是否中奖
* @param rate 中奖概率
* @return xxx
*/
private static boolean canReward(double rate) {
return Math.random() <= rate;
}
/**
* 返回min~max区间内随机数,含min和max
* @param min xxx
* @param max xxx
* @return xxx
*/
private static int getRandomVal(int min, int max)