将x拆分为y部分的随机数,最大值为n

时间:2018-06-13 11:16:13

标签: javascript math mathematical-optimization

任何人都可以提供一种方法将数字拆分成具有最大值的x个随机部分吗?

即。     要拆分的总数= 50     分成几部分= 10     每个零件的最大值= 10

will return something like 
3,7,4,6,9,1,2,8,5,5 

每个部分都是随机的。没有统一只需要y个随机数加起来x,每个部分最大val。

我已经发现了这个

var n = 16;
var a = [];
while (n > 0) {
 var s = Math.round(Math.random() * (n- 1)) + 1;

  a.push(s);
  n -= s;
}
console.log(a);

但是这不会给出x个部分。这是随机数量的部分...

2 个答案:

答案 0 :(得分:2)

这是一种方法。首先创建一个均匀分布的数组,以获得正确的“部分”,然后循环通过它,并为每个“部分”添加一个随机数,同时从另一个随机索引中删除相同的数字。

var n = 160;
var a = [];
var x = 10;
var b = n/x;

for(var i=0; i<x; i++){
  a.push(b);//create an array of 10 parts with the same value
}
for(var i=0; i<x; i++){
  var s = Math.round((Math.random()*b)) ;
  var index = Math.round((Math.random()*x))-1 ;
  a[i] += s;
  a[index] -=s;
}
console.log(a);

答案 1 :(得分:1)

var n = 16;
var a = [];
var parts = 10;
var maxValuePerPart = 10;

for(let i = 0; i < parts; i++){
 let max = (maxValuePerPart < n) ? maxValuePerPart : n;
 let min = 1;
 var s = Math.floor(Math.random() * (max - min)) + min;
  a[i] = s;
  n -= s;
}

console.log(a);

如果这不是你想要的话,请告诉我