我这个方法比较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]
一个小白程序员,欢迎大佬批评和指点,感激不尽。