满足下面这种需求的java算法有哪位大牛会么?

一个总数,拆分成n个数,拆分的这几个数总和等于这个总数,并且每个数有最大和最
小限制,限制区间可以为正负数.

例如:总数等于1000 , 拆分成 10个数 , 每个数的范围区间在 -10到200.

且随机拆成的10个数累加等于1000.

以下是参考代码

package test;

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

public class Test {
    // 保存生成的随机数
    private static List<Integer> resultList = new ArrayList<Integer>();
    public static void main(String[] args) {
        // 总数
        int number = 10;
        // 最大限制
        int max = 10;
        // 最小限制
        int min = -2;
        // 拆分成个数
        int area = 4;
        // 按照规则拆分数字
        // 注意:数字越大,计算的时间越长
        mySplitNumber(number,max,min,area);
    }

    /**
     * 按照规则拆分数字
     * @author: renkai721
     * @date: 2020年4月3日 上午9:56:17
     * @Title: mySplitNumber 
     * @Description: 
     * @param number
     * @param max
     * @param min
     * @param area
     *
     */
    private static void mySplitNumber(int number, int max, int min, int area) {
        // 按照最大最小生成随机数
        boolean isRunning = true;
        int index = 0;
        while (isRunning) {
            index+=1;
            System.out.println("计算次数="+index);
            // 计算中
            int runningCount = myCreateRandom(max, min, area);
            if(number == runningCount) {
                // 如果计算的数字相加等于总数就不计算了,否则就一直计算
                isRunning = false;
                System.out.println("题目:总数="+number+", 最大限制="+max+", 最小限制="+min+", 拆分成="+area+"个数");
                System.out.print("结果:总数="+runningCount+", 生成的随机数=[");
                for (int i = 0; i < resultList.size(); i++) {
                    System.out.print(resultList.get(i)+",");
                }
                System.out.print("]");
            }
        }

    }
    /**
     * 按照规则生成随机数
     * @author: renkai721
     * @date: 2020年4月3日 上午9:55:59
     * @Title: myCreateRandom 
     * @Description: 
     * @param max
     * @param min
     * @param area
     * @return
     *
     */
    private static int myCreateRandom(int max, int min, int area) {
        resultList = null;
        resultList = new ArrayList<Integer>();
        int tempCount = 0;
        for(int i=0;i<area;i++) {
            // 注意,随机数规则不包含max和min两个数,如果需要包含把max+1,min-1即可
            int random = (int) (Math.random()*(max-min)+min);
            resultList.add(random);
            tempCount += random;
        }
        return tempCount;
    }
}




以下是输出结果


计算次数=1
计算次数=2
计算次数=3
计算次数=4
计算次数=5
计算次数=6
计算次数=7
计算次数=8
计算次数=9
计算次数=10
计算次数=11
计算次数=12
计算次数=13
计算次数=14
计算次数=15
计算次数=16
计算次数=17
计算次数=18
计算次数=19
题目:总数=10, 最大限制=10, 最小限制=-2, 拆分成=4个数
结果:总数=10, 生成的随机数=[1,2,8,-1,]

你可以百度一下抢红包算法,唯一的区别就是你要求下界是-10,而抢红包算法是0,抢红包算法每次随机的上界是剩余钱数/剩余人数*2,和你的200一样。