1 /** 2 * 将一个数随机拆分为多个整数 3 * @param beans 最终结果集 默认null 4 * @param num 补偿结果集 默认null 5 * @param digital 需要拆分的数 6 * @param fraction 需要拆分的份数 7 * @param avg 拆分平均值 默认为null 8 * @return 9 */ 10 private static List<Integer> distribution(Integer[] beans,Integer[] num,Integer digital, Integer fraction,Integer avg) { 11 //初始化 beans 12 if(ObjectUtils.isEmpty(beans)) { 13 beans = new Integer[fraction]; 14 for (int i = 0; i < fraction; i++) { 15 beans[i] = 0; 16 } 17 } 18 //初始化 avg 19 if(ObjectUtils.isEmpty(avg)) { 20 avg = digital/fraction; 21 } 22 23 //创建大小为 fraction 的数组 24 num = new Integer[fraction]; 25 //快速填充随机数,前fraction-1个参与分配 26 Integer reduce = 0 ; 27 for (int i = 0; i < fraction - 1; i++) { 28 num[i] = (int) Math.pow(Math.round(Math.random() * 1000), 1); 29 reduce += num[i]; 30 } 31 //用于收集差值 32 num[fraction - 1] = 0; 33 //比例设置值 34 Integer sum = 0; 35 for (int i = 0; i < fraction - 1; i++) { 36 // BigDecimal.ROUND_DOWN 向下取整会导致最后一个值随着fraction增大而增大 37 num[i] = ((new BigDecimal(num[i])).multiply(new BigDecimal(digital)).divide(new BigDecimal(reduce), 0, BigDecimal.ROUND_DOWN)).intValue(); 38 if(num[i] == 0) { 39 num[i] = 1; 40 } 41 //不能提前 break 退出,需要处理完所有结果 42 if(sum +num[i]> digital) { 43 num[i] = 0; 44 } 45 beans[i] += num[i]; 46 sum += num[i]; 47 } 48 //设置数组最后一个值 49 num[fraction - 1] = digital - sum; 50 51 //如果最后一个值过大 52 if(num[fraction - 1]>avg) { 53 distribution(beans,num,num[fraction - 1], fraction,avg); 54 } else { 55 beans[fraction - 1] += num[fraction - 1]; 56 } 57 //以 list 形式返回 58 return Arrays.asList(beans); 59 }