仅仅做了一个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));
}
}
}