如何创建具有给定长度和给定总和的“几乎相等”整数的数组?

时间:2018-07-25 01:06:23

标签: javascript

假设我有一袋 N 软糖,我想将它们尽可能均匀地分配给 P 人。我想要一个数组,显示每个人得到的软糖的数量。

例如,我有23个软糖在5个人中分配。该数组应类似于[5, 5, 5, 4, 4]

我想这更多是一个数学问题,但是我正在寻找JavaScript解决方案。

1 个答案:

答案 0 :(得分:0)

一个有趣的简单(低效)解决方案,类似于小型人通常解决此问题的方式。

var P=5
var Nbeans=23
var people=new Array(P).fill(0);

for (var beans=0; beans < Nbeans;beans++){
  people[beans % P]++
}
console.log(people)

或更有效;

P=5
Nbeans=23
people=new Array(P).fill(Math.floor(Nbeans/P));
var beansLeft=Nbeans%P;
for (var luckyOnes=0; luckyOnes < beansLeft;luckyOnes++){
  people[luckyOnes]++
}
console.log(people)

最后,如果您想真正提高效率,并确保只对每个数组元素寻址一次,则可以使用类型化数组子数组方法。

var N=5;
var Nbeans=23;
var people=new Uint32Array(N);
var numLucky=Nbeans%N;
people.subarray(0,numLucky).fill(Math.ceil(Nbeans/N));
people.subarray(numLucky,people.length).fill(Math.floor(Nbeans/N));
console.log(people);