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

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

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


回答:

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


回答:

可以用微信红包算法实现,其实本质是一样的,就是一个数N随机分为M份。
参见微信红包随机算法。https://www.zhihu.com/question/22625187


回答:

如果用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;

}


回答:

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

以上是 怎样随机生成10个数字,保证这10个数字加起来是100? 的全部内容, 来源链接: utcz.com/a/161720.html

回到顶部