一个数正整数随机分成N个在p到q之间的的正整数。

我这个方法比较low,大致意思就是把这个正整数分成若干份,再一小份一小份的随机分。

大正整数:sum.
随机分的份数:n.
随机出来正整数的范围:[p,q].
场景暂时就先假设了。
sum=48262. n=100 . [1,999]

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class lzy {
    public static void main(String[] args) {
        Integer sum = 48262;
        Integer n = 100;
        //这里是把大的正整数拆分为20份。每份为x
        Integer r = 20;
        Integer x = sum / n;
        //有余数 定为y
        Integer y = sum % n;
        /**
         * 下面开始逻辑
         * 先创建了两个集合
         * 一个用于存随机出来的100个随机数。(result)
         * 一个用于存每份随机出来的随机数
         */
        List<Integer> result = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        for (int j = 1; j <= r; j++) {
            Integer o = x;
            //因为是要随机分出100个随机数,我这里分为了20份 所以一份是5个
            for (int i = 1; i <= 5; i++) {
                //t 为每次随机出来的 1~999之间的数
                Integer t = (int) (Math.random() * 999 + 1);
                x = x - t;
                //因为前4个是随机出来的先暂存在小集合 list中
                if (i <= 4) {
                    list.add(t);
                    //最后一位要存减完剩余的那个数。 要借此判定。
                } else {
                    list.add(x);
                }
            }
            //这里是要还原x
            x = o;
            /**
             * 这里开始判定第五位。
             * 因为前4位是随机出来的,一定合乎要求,
             * 所以判定第5位是否满足要求就ok
             * 如果满足 这5个数均满足要求。把这5个数存进大集合中
             */
            if (list.get(4) < 0) {
                list.clear();
                //r是循环的次数 因为这组数不满足要求 所以 作废  此次循环不算 这里要加一次循环次数
                r = r + 1;
            } else if (list.get(4) > 999) {
                list.clear();
                r = r + 1;
            } else {
                //这里是把小集合中的数拿出存入大集合
                for (Integer l : list) {
                    result.add(l);
                }
                list.clear();
            }
        }
        /**
         * 到此是拿出了分解出的100个数
         * 还有余数没有处理
         * 因为是分为了20份 所以余数一定小于20
         * 这里是找出一个可以加上余数还满足条件的数
         */
        for (Integer i: result) {
            if (999-i>20){
                i = i+y;
                log.info("结束寻找");
                break;
            }
        }
        log.info("把分解出来的数存在一个数组中"+result);
    }
}

以上是详细代码,注释表的比较详细。
里面的参数都可以随意调换。

结果如下

2020-03-02 17:47:27.286 [main] INFO lzy.java:73 结束寻找
2020-03-02 17:47:27.289 [main] INFO lzy.java:77 把分解出来的数存在一个数组中[18, 18, 15, 134, 257, 61, 121, 33, 73, 67, 83, 6, 215, 73, 14, 257, 69, 5, 139, 3, 155, 42, 99, 59, 96, 144, 73, 9, 114, 68, 38, 111, 84, 3, 45, 84, 126, 167, 38, 49, 77, 54, 20, 258, 3, 70, 74, 68, 64, 77, 38, 14, 21, 169, 117, 59, 253, 15, 29, 104, 18, 138, 25, 34, 188, 125, 21, 5, 106, 174, 126, 59, 141, 9, 15, 14, 151, 31, 42, 226, 45, 110, 62, 164, 78, 212, 137, 53, 49, 2, 83, 51, 26, 69, 154, 155, 42, 70, 15, 112]

一个小白程序员,欢迎大佬批评和指点,感激不尽。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值