如何将javascript中的数字n分成x部分,其中所有部分的总和等于数字?

cjh*_*193 2 javascript arrays math

我有一个数字,我需要将其分成 5 部分。但是,我希望每个部分都是一个随机数。但是当所有部分加在一起时,它们等于原始数字。我不确定如何用 JavaScript 做到这一点。此外,我不希望分割部分的最小值为 0 或 1,我想自己设置最小值。

例如,数字是 450。我希望分割的部分不小于 60。所以首先,数组将是 [60,60,60,60,60]。但我想随机化,以便它们加起来为 450。这样做的最佳方法是什么?

谢谢!

这是我迄今为止尝试过的:

let i = 0;
let number = 450;
let numArray = [];
while(i <= 5){
  while(number > 0) {
    let randomNum = Math.round(Math.random() * number) + 1;
    numArray.push(randomNum);
    number -= randomNum;
  }
  i += 1;
}
Run Code Online (Sandbox Code Playgroud)

Sip*_*lor 5

将五个最小值(例如min = 60)相加:

var minSum = 5 * min
Run Code Online (Sandbox Code Playgroud)

orNumber = 450然后求出原来的数字 ( ) 和之间的差值minSum

var delta = orNumber - minSum
Run Code Online (Sandbox Code Playgroud)

现在你得到 4 个不同的随机数,范围从 0 到 1。

将这些数字按升序排序。

Foreach 这些随机数执行以下操作:

  • 从最后一个减去它(或第一个为零)
  • 将此数字乘以 ,delta即可得到其中一个部分。

最后一部分是delta减去所有其他部分。

之后您只需将您的添加min到所有部分即可。


sma*_*c89 5

让你的数字是 N,让 p n是第 n 部分。获得 5 个部分:

  • p 1 = 0 到 N 之间的随机数
  • p 2 = 0 和 N 之间的随机数 - p 1
  • p 3 = 0 和 N 之间的随机数 - p 2 - p 1
  • p 4 = 0 和 N 之间的随机数 - p 3 - p 2 - p 1
  • p 5 = N - p 4 - p 3 - p 2 - p 1

编辑 2017

为了让它看起来更随机,在你生成数字后洗牌

编辑 2020

我想一些代码不会受到伤害。使用 ES7 生成器:

function* splitNParts(num, parts) {
    let sumParts = 0;
    for (let i = 0; i < parts - 1; i++) {
        const pn = Math.ceil(Math.random() * (num - sumParts))
        yield pn
        sumParts += pn
    }
    yield num - sumParts;
}
Run Code Online (Sandbox Code Playgroud)

小提琴链接