发放随机优惠券金额算法

/**
	 * 依据红包数和红包总额
	 * @param number 红包总数
	 * @param total 红包总额
	 * @param min 最小红包金额
	 * @return 红包金额列表
	 */
	public static List<Float> createHongbaoAmount(int number, float total, float min ,float maxHongbao){
		float money;//红包金额
        float moneyFloat;//红包金额小数点
        double max;
        int i = 1;
        List<Float> math = new ArrayList<Float>();

        DecimalFormat df = new DecimalFormat("##0.00");
        while (i < number) {
            //保证即使一个红包是最大的了,后面剩下的红包,每个红包也不会小于最小值
            max = total - min * (number - i);
            int k = (int)(number - i) / 2;
            //保证最后两个人拿的红包不超出剩余红包
            if (number - i <= 2) {
                k = number - i;
            }
            //最大的红包限定的平均线上下
            max = max / k;
            //保证每个红包大于最小值,又不会大于最大值
            moneyFloat = (float) (min * 100 + Math.random() * (max * 100 - min * 100 + 1));
            moneyFloat = (float)moneyFloat / 100;
            //保留两位小数
            moneyFloat = Float.parseFloat(df.format(moneyFloat));
            if(moneyFloat<min){
            	moneyFloat = min;
            }
            if(moneyFloat>maxHongbao){
            	moneyFloat = maxHongbao;
            }
            total=(total - moneyFloat);
            //total = total/100;
            
            money = Float.parseFloat(String.valueOf(moneyFloat).substring(0,String.valueOf(moneyFloat).length()-2));
            math.add(moneyFloat);
            //log.info("the " + i + " get " + money  + ";left" + total);
            i++;
            //最后一个人拿走剩下的红包
            if (i == number) {
            	money = Float.parseFloat(String.valueOf(total).substring(0,String.valueOf(total).length()-2));
                math.add(Float.parseFloat(df.format(money)));
                //log.info("the " + i + " get " + total  + ";left "+total);
            }
        }
        for(int j=0;j<math.size();j++){
        	Float maxMath = Collections.max(math);
	        if(maxMath>maxHongbao){
	        	int indexMax = math.indexOf(Collections.max(math));
	        	int indexMin = math.indexOf(Collections.min(math));
	        	math.set(indexMax, maxHongbao);
	        	math.set(indexMin, Collections.min(math) +maxMath-maxHongbao);
	        }
        }
        float sumMath = 0;
        for(int j=0;j<math.size();j++){
        	sumMath += math.get(j);
        }
        System.out.println("sumMath:"+sumMath);
        //取数组中最大的一个值的索引
       System.out.println("the " + (math.indexOf(Collections.max(math)) + 1) + " is max");
        return math;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值