记录一下红包算法(按照自己的想法写的,随机性并不是很好)

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++;
        }
    }
}

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

发布了40 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38796327/article/details/103879098