关于微信红包的一些算法可能性

仅仅做了一个Demo,波动数字不建议输入超过0.5

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Random;

/**
 * Created by 草鱼狂飙 on 2016/9/28.
 * <p>
 * 描述:
 */
public class RedPackets {


    public static void main(String[] args) {
        for (int i = 0; i < 10000; i++) {
            ArrayList<Double> nums = getNums(7777.00, 10, 0.3);
            printArrayList(nums);
            System.out.println("================================" + getSumFormArrayList(nums));
        }

    }

    /**
     * @param total    收红包的总数
     * @param num      人数
     * @param variance 上下偏差
     * @return 返回红包数组
     */
    private static ArrayList<Double> getNums(Double total, int num, double variance) {
        Random random = new Random(System.currentTimeMillis());
        double average = total / num;
        double varianceFloat = average * variance;
        ArrayList<Double> moneys = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            moneys.add(average - varianceFloat + random.nextDouble() * varianceFloat * 2);
        }
        Double surplus = total - getSumFormArrayList(moneys);
        for (int i = 0; i < num; i++) {
            moneys.set(i, moneys.get(i) + surplus / num);
        }
        for (int i = 0; i < moneys.size(); i++) {
            moneys.set(i, new BigDecimal(moneys.get(i)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
        }
        surplus = total - getSumFormArrayList(moneys);
        surplus = new BigDecimal(surplus).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        int randomindex = random.nextInt(num - 1);
        moneys.set(randomindex, moneys.get(randomindex) + new BigDecimal(surplus).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
        return moneys;
    }

    private static Double getSumFormArrayList(ArrayList<Double> vlistdata) {
        BigDecimal result = new BigDecimal(0.00);
        for (int i = 0; i < vlistdata.size(); i++) {
            result = new BigDecimal(vlistdata.get(1)).add(result);
        }
        return result.doubleValue();
    }

    private static void printArrayList(ArrayList<Double> vlistdata) {
        for (int i = 0; i < vlistdata.size(); i++) {
            System.out.println("第" + (i + 1) + "个红包:" + vlistdata.get(i));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值