微信随机红包源码

package cn.com.yitong.ares.icbs.common.util;

import java.util.ArrayList;

import java.util.List;

import com.alibaba.dubbo.remoting.exchange.Response;

/**
 * 根据上下限额生成随机红包
 * 
 * @param context
 * @param money
 *            总金额
 * @param count
 *            数量
 * @param maxmoney
 *            红包最大金额
 * @param maxmoney
 *            红包最小金额 上下文 author wy
 * @return list
 */

public class RedPacketUtils {

    private static boolean isRight(double money, int count, double maxmoney, double minmoney) {
        double avg = money / count;
        if (avg < minmoney) {
            return false;
        } else if (avg > maxmoney) {
            return false;
        }
        return true;
    }

    /**
     * @param money
     * @param mins
     * @param maxs
     * @param count
     * @param maxmoney
     * @param minmoney
     * @return
     */
    private static double randomRedPacket(double money, double mins, double maxs, int count, double maxmoney,
            double minmoney) {
        if (count == 1) {
            return (double) (Math.round(money * 100)) / 100;
        }
        if (mins == maxs) {
            return mins;// 如果最大值和最小值一样,就返回mins
        }
        double max = maxs > money ? money : maxs;
        double one = ((double) Math.random() * (max - mins) + mins);
        one = (double) (Math.round(one * 100)) / 100;
        double moneyOther = money - one;
        if (isRight(moneyOther, count - 1, maxmoney, minmoney)) {
            return one;
        } else {
            // 重新分配
            double avg = moneyOther / (count - 1);
            if (avg < minmoney) {
                return randomRedPacket(money, mins, one, count, maxmoney, minmoney);
            } else if (avg > maxmoney) {
                return randomRedPacket(money, one, maxs, count, maxmoney, minmoney);
            }
        }
        return one;
    }

    private static final double TIMES = 2.1f;

    public static List<Double> splitRedPackets(double money, int count, double maxmoney, double minmoney) {
        if (!isRight(money, count, maxmoney, minmoney)) {
            return null;
        }
        List<Double> list = new ArrayList<Double>();
        double max = (float) (money * TIMES / count);

        max = max > maxmoney ? maxmoney : max;
        for (int i = 0; i < count; i++) {
            double one = randomRedPacket(money, minmoney, max, count - i, maxmoney, minmoney);
            list.add(one);
            money -= one;
        }
        return list;
    }
}
 

猜你喜欢

转载自blog.csdn.net/weixin_42210904/article/details/86685421
今日推荐