怎样随机生成10个数字,保证这10个数字加起来是100?

弱问个问题,如果想随机生成10个数字,保证这10个数字加起来是100,怎么做比较好?场景为,某人有100万资金,有10个项目可以投资,必须全部花完,该投资者随机分配资金。这个该怎么写?

阅读 9.2k
6 个回答

在0~100之间随机取9个数就可以了,相当于一条线段上随机取9个点分成10段。
具体的随机性没有测试过。

如果用js的话,可以贴到浏览器的Console试一下

const result = [];
const sum = 100;
[
    ...new Array(9).fill(0).map(() => Math.random() * sum | 0).sort((a, b) => b-a), 
    0,
].reduce((pre, cur) => {
    result.push(pre - cur);
    return cur;
}, sum);
console.log(result);

// 验证
result.reduce((p, c) => { p += c; return p }, 0);

输出:[23, 20, 4, 4, 1, 2, 0, 5, 37, 4]
输出:[11, 13, 12, 4, 2, 28, 7, 13, 4, 6]

new Array(9).fill(0).map(i=>Math.random() * 100 << 0).sort((a,b)=>a-b).concat(100).reduce((a,b,i,arr)=>(a.push(b-(arr[i-1] || 0)), a), [])
随机在100以内按升序生成9个断点,再加上100,然后获得任何一个数和前一个数之差(第一个数保留),就是答案了。

以下是java代码的实现。

public static List getRedPackage(int number,float total){
        float money;
        double min = 0.01; // 每个的最小值
        double max;
        int i = 1;
        List math = new ArrayList();
        DecimalFormat df = new DecimalFormat("###.##");
        while (i < number) {
            max = total - min * (number - i);
            int k = (int)(number - i) / 2;
            if (number - i <= 2) {
                k = number - i;
            }
            max = max / k;
            money = (int) (min * 100 + Math.random() * (max * 100 - min * 100 + 1));
            money = (float)money / 100;
            money = Float.parseFloat(df.format(money));
            total=(int)(total*100 - money*100);
            total = total/100;
            math.add(money);
            i++;
            if (i == number) {
                math.add(total);
            }
        }
        return math;
    }

好像《编程珠玑》,有一篇总统投票的问题,专门讲的这个,楼主可以上网查查看,写的很漂亮还很简单易懂。

推荐问题