发红包分为(金额为Double类型)
普通红包:一笔金额平均分成n等份
手气红包:金额随机发放
发普通红包
定义一个Double类型变量Money来接受金额,然后将发放金额转换成分,避免进度损失;定义int类型变量count代表分成几份。先将Money与count 做除法运算来获得每一份的金额;再做取余运算,看是否有余数,如果有,之后将其添加到其中一份金额中。如果再用等分定义一个集合,循环存放n-1等份金额,将最后一份金额加上余数(如果有余数的话)。
public static void sendMoney(Double money, int count){
ArrayList<Double> moneyList = new ArrayList<>();
money = money * 100;//转化为分
int avgMoney = (int)(money / count);//转化为int类型去除小数
Double overMoney = money % count;
for (int i = 0; i < count - 1; i++) {
moneyList.add(avgMoney / 100.0);
}
if (overMoney == 0){
moneyList.add(avgMoney / 100.0);
}else {
moneyList.add((avgMoney + overMoney) / 100.);//将余数加在最后一份上
}
}
发手气红包
手气红包主要是在金额要怎样随机,不能一下分出特别大的金额,不让回会出现分到0元的可能,所以要规定每一份金额的取值范围取。
找到的一份规定。。。。
当前剩余平均金额 = 剩余总金额 / 剩余红包个数
每一份随机金额范围(除最后一份),最小值为1,最大值为当前剩余平均金额的2倍 ,单位为"分"
随着金额的减少,每一次金额的随机取值范围都在变化。
public static void sendMoney(Double money, int count){
Random rd = new Random();
ArrayList<Double> moneyList = new ArrayList<>();
money = money * 100;
int n = count - 1;//分几份
for (int i = 0; i < n; i++) {
//随机的数作为一份金额
int m = rd.nextInt((int)(money / count * 2))+1;
moneyList.add(m / 100.0);
//总金额 - 随机金额 = 下一轮要分的总额
money -= m;
//每一轮后分的份数-1
count--;
}
moneyList.add(money / 100.0);
System.out.println(moneyList);
}
PS:网上还有很多取发红包的例子