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

来源:互联网 发布:襄阳seo 编辑:程序博客网 时间:2024/06/04 23:32

仅仅做了一个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));        }    }}
0 0
原创粉丝点击