Java红包拆分均匀拆分和随机拆分
红包拆分的策略:
- 普通红包(平均)
- 手气红包(随机)
分析:
现实的红包都是以分为最小的计算单位,我们把发送的总金额
totalMoney
转换为分的整数(int)类型。平均分配会遇到总金额除不尽的方法,通过把最后的余数放到最后一个包的做法,较为妥当。
随机红包,避免每个包差距太大,我们要确保每次分发的包最多不超过余下所要分发平均数的2倍。
要确保每一个包中至少有0.01元。
综合3、4得出每次分发的计算公式 :
leftMoney
(分发剩余的钱)、leftCount
(剩余需要分发的份数),将分发剩余的最后一份放到最后的一个包。
-
Java 参考代码:
import java.util.ArrayList; import java.util.Random; public class RandomSplit { public static void main(String[] args) { // 测试代码 ArrayList<Integer> list = new ArrayList(); list = randomDivide(20, 3); for (int i = 0; i < list.size(); i++) { System.out.println((double) list.get(i) / 100); } } /**** * 红包拆分方法 * @param money 被拆分的总金额 (单位元) * @param count 被拆分的红包个数 * @return 拆分后的每个红包金额数组 */ public static ArrayList<Integer> randomDivide(double money, int count) { // 创建一个长度的红包数组 ArrayList<Integer> redList = new ArrayList<>(); // 由于double的精度分体将其转换为int计算, 即将元转换为分计算,红包最小单位以分计算 int totalMoney = (int) (money * 100); // 判断红包的总金额 if (money > 200) { System.out.println("单个红包不能超过200元"); return redList; // 返回空的红包集合 } if (totalMoney < count || totalMoney < 1) { System.out.println("被拆分的总金额不能小于0.01元"); return redList; // 返回空的红包集合 } //2. 进行随机分配 Random rand = new Random(); int leftMoney = totalMoney; // 剩余金额 int leftCount = count; // 剩余份数 // 随机分配公式:1 + rand.nextInt(leftMoney / leftCount * 2); for (int i = 0; i < count - 1; i++) { int money_ = 1 + rand.nextInt(leftMoney / leftCount * 2); redList.add(money_); leftMoney -= money_; leftCount--; } // 把剩余的最后一个放到最后一个包里 redList.add(leftMoney); return redList; } public static ArrayList<Integer> averageDivide(double money, int count) { // 创建一个长度的红包数组 ArrayList<Integer> redList = new ArrayList<>(); // 由于double的精度分体将其转换为int计算, 即将元转换为分计算,红包最小单位以分计算 int totalMoney = (int) (money * 100); int avg = totalMoney / count; int mod = totalMoney % count; for (int i = 0; i < count - 1; i++) { redList.add(avg); } redList.add(avg + mod); return redList; } }