zoukankan      html  css  js  c++  java
  • 将一个数随机拆分成多个整数

     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     }
    代码如下
  • 相关阅读:
    jQuery easing 插件使用方法
    JavaScript事件
    JQuery DOM 的常用操作
    javascript--浏览器对象模型BOM、文本对象模型DOM、JavaScript 语言基础ECMAScript
    javascript---location对象、navigator对象、screen对象以及他们的属性;
    javascript---函数substring(position1,position2),slice(position1,position2),substr(position1,length)
    用Javascript获取页面元素的位置
    Ajax模式2
    实时刷新Winform中Label的Text
    log4net用法
  • 原文地址:https://www.cnblogs.com/tangzeqi/p/15165054.html
Copyright © 2011-2022 走看看