随机红包算法java代码实现

2020-04-27 18:56栏目:编程

这个算法的结果就是会造成一种趋势,趋势就是基本上所有的红包在最后几个都无限接近于最大值。随机性不是很好,欢迎各位大牛留言,直接指出可优化点都可以,虚心求教。

package com.feifei.demo.arithmetic;
 
 
import java.math.BigDecimal;
import java.util.Random;
 
 
/**
 *
 * 指定红包算法,红包金额,红包数,最大值,最小值
 */
public class Test {
 
    public static void main(String[] args) {
        deliveryMoney(BigDecimal.valueOf(100), 10, BigDecimal.valueOf(0), BigDecimal.valueOf(12));
    }
 
    /**
     *
     * 保证每次分配完成后都能够使剩余金额总量 <= (number - k) * max 的最大值
     * k为领取的红包数
     * @param totalMoney 总金额
     * @param number 红包数
     * @param min 最小金额
     * @param max 最大金额
     */
    public static void deliveryMoney(BigDecimal totalMoney, int number, BigDecimal min, BigDecimal max) {
        int k = 1;
        // 记录剩余金额
        BigDecimal remainMoney = totalMoney;
 
        while (k <= number) {
            if  (k == number) {
                System.out.println("第" + k + "次分配的红包为:" + remainMoney);
                break;
            }
 
            // 开始分配红包
            BigDecimal scale = BigDecimal.valueOf(new Random().nextDouble() * (max.subtract(min).doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP);
            BigDecimal money = min.add(scale);
 
            // 临时剩余总金额
            BigDecimal tempRemainMoney = remainMoney.subtract(money).setScale(2, BigDecimal.ROUND_HALF_UP);
 
            // 如果剩余金额要大于最大的金额, 获取剩余总金额小于最小的金额,则重新分配
           if (tempRemainMoney.compareTo(max.multiply(BigDecimal.valueOf(number - k))) > 0 || tempRemainMoney.compareTo(min.multiply(BigDecimal.valueOf(number - k))) < 0) {
                continue;
            }
 
            System.out.println("第" + k + "次分配的红包为:" + money);
            remainMoney = remainMoney.subtract(money);
            k++;
        }
    }
}

本文来自网络,不代表山斋月平台立场,转载请注明出处: https://www.shanzhaiyue.top