怎样随机生成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