四川省住房和城乡建设厅官方网站,软件设计培训,做外贸用什么平台,游戏开发需要的软件红包算法
首先#xff0c;如果红包只有一个#xff0c;本轮直接使用全部金额#xff0c;确保红包发完。
然后#xff0c; 计算出本次红包最少要领取多少#xff0c;才能保证红包领完#xff0c;即本轮下水位#xff1b; 本轮最多领取多少#xff0c;才能保证每个人都…红包算法
首先如果红包只有一个本轮直接使用全部金额确保红包发完。
然后 计算出本次红包最少要领取多少才能保证红包领完即本轮下水位 本轮最多领取多少才能保证每个人都领到即本轮上水位。
主要方式如下 计算本次红包金额下水位假设本次领到最小值1分那接下来每次都领到200元红包能领完那下水位为1分如果不能领完那按接下来每次都领200元剩下的本轮应全部领走是本轮的下水位。
计算本轮红包上水位假设本轮领200元剩下的钱还足够接下来每轮领1分钱那本轮上水位为200元如果已经不够领那按接下来其他领1分计算本轮的上水位。
为了使红包金额不要太悬殊使用红包均值调整上水位。如果上水位金额大于两倍红包均值那么使用两倍红包均值作为上水位。换句话说每一轮抢到的红包金额最高为两倍剩下红包的均值。
最后获取随机数并用上水位取余如果结果比下水位还小则直接使用下水位否则使用随机金额为本轮拆到金额。
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Random;public class RandomRedPocket implements RedPocket {BigDecimal avgAmount;private BigDecimal totalAmount;private BigDecimal lowestAmount;private Integer remainNum;public RandomRedPocket(BigDecimal totalAmount, int num) {this.totalAmount totalAmount;this.remainNum num;this.avgAmount totalAmount.divide(new BigDecimal(num), 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(2));this.lowestAmount BigDecimal.valueOf(0.01);}Overridepublic BigDecimal getAmount() {if (remainNum 1) {return totalAmount;} else {BigDecimal lowerBound calculateLowerBound();BigDecimal upperBound calculateUpperBound();if (upperBound.compareTo(avgAmount) 0) {upperBound avgAmount;}remainNum remainNum - 1;BigDecimal randomAmount genRandomMoney(lowerBound, upperBound);totalAmount totalAmount.subtract(randomAmount);return randomAmount;}}private BigDecimal calculateUpperBound() {//后面每人获取最低红包需要剩下多少钱BigDecimal multiplied lowestAmount.multiply(BigDecimal.valueOf(remainNum - 1));BigDecimal upperBound totalAmount.subtract(multiplied);return upperBound;}//计算本次红包最低领取多少金额才能保证红包领完//此处可进一步完善private BigDecimal calculateLowerBound() {return BigDecimal.valueOf(0.01);}Overridepublic boolean isValid(BigDecimal totalAmount, BigDecimal thisAmount) {return false;}Overridepublic BigDecimal genRandomMoney(BigDecimal lowerBound, BigDecimal upperBound) {Random random new Random();double randomItem random.nextDouble();BigDecimal decimal upperBound.subtract(lowerBound).multiply(new BigDecimal(randomItem)).add(lowerBound);decimal decimal.setScale(2, RoundingMode.HALF_UP);return decimal;}
}