Java紅包拆分均勻拆分和隨機(jī)拆分
紅包拆分的策略:
- 普通紅包(平均)
- 手氣紅包(隨機(jī))
分析:
現(xiàn)實(shí)的紅包都是以分為最小的計(jì)算單位,我們把發(fā)送的總金額
totalMoney
轉(zhuǎn)換為分的整數(shù)(int)類(lèi)型钠乏。平均分配會(huì)遇到總金額除不盡的方法酥泞,通過(guò)把最后的余數(shù)放到最后一個(gè)包的做法吵血,較為妥當(dāng)尖殃。
隨機(jī)紅包以故,避免每個(gè)包差距太大坦弟,我們要確保每次分發(fā)的包最多不超過(guò)余下所要分發(fā)平均數(shù)的2倍护锤。
要確保每一個(gè)包中至少有0.01元。
綜合3酿傍、4得出每次分發(fā)的計(jì)算公式 :
leftMoney
(分發(fā)剩余的錢(qián))烙懦、leftCount
(剩余需要分發(fā)的份數(shù)),將分發(fā)剩余的最后一份放到最后的一個(gè)包赤炒。
-
Java 參考代碼:
import java.util.ArrayList; import java.util.Random; public class RandomSplit { public static void main(String[] args) { // 測(cè)試代碼 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 被拆分的紅包個(gè)數(shù) * @return 拆分后的每個(gè)紅包金額數(shù)組 */ public static ArrayList<Integer> randomDivide(double money, int count) { // 創(chuàng)建一個(gè)長(zhǎng)度的紅包數(shù)組 ArrayList<Integer> redList = new ArrayList<>(); // 由于double的精度分體將其轉(zhuǎn)換為int計(jì)算, 即將元轉(zhuǎn)換為分計(jì)算氯析,紅包最小單位以分計(jì)算 int totalMoney = (int) (money * 100); // 判斷紅包的總金額 if (money > 200) { System.out.println("單個(gè)紅包不能超過(guò)200元"); return redList; // 返回空的紅包集合 } if (totalMoney < count || totalMoney < 1) { System.out.println("被拆分的總金額不能小于0.01元"); return redList; // 返回空的紅包集合 } //2. 進(jìn)行隨機(jī)分配 Random rand = new Random(); int leftMoney = totalMoney; // 剩余金額 int leftCount = count; // 剩余份數(shù) // 隨機(jī)分配公式: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--; } // 把剩余的最后一個(gè)放到最后一個(gè)包里 redList.add(leftMoney); return redList; } public static ArrayList<Integer> averageDivide(double money, int count) { // 創(chuàng)建一個(gè)長(zhǎng)度的紅包數(shù)組 ArrayList<Integer> redList = new ArrayList<>(); // 由于double的精度分體將其轉(zhuǎn)換為int計(jì)算, 即將元轉(zhuǎn)換為分計(jì)算,紅包最小單位以分計(jì)算 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; } }