セットの長さの数値の配列を作成し、そのセットの最小値と最大値を定義し、その間の残りの数字。キッカーは、この数列の合計が所定の値と等しくなければならないということです。そのトリックは、その機能がどのように機能するかを調べることです。値の配列を返す方法(合計値は指定した数値に等しい)
私は私に、以下の機能を持っている、this on stack overflowが見つかりました:
export const distributeValues = (amount, weights=[]) => {
const distributedAmounts = []
let totalWeights = weights.reduce((a,b) => a + b)
weights.forEach(weight => {
const weightValue = parseFloat(weight)
const percentage = weightValue/totalWeights
const distributedAmount = Math.round(percentage * amount)
distributedAmounts.push(distributedAmount)
totalWeights -= weightValue
amount -= distributedAmount
})
return distributedAmounts
}
は、これは良いスタートのように思えるが、私は実際には逆方向に動作する必要があります。私は上記の関数に渡されるウェイトを私に与える関数を見つけようとしています。
は今、私はこの二つの部分(冗長性のために謝罪)に分ける機能を有する:
export const getDistributions = (amount, distributions, modifier) => {
const values = []
let amountLeft = amount;
for (let i = 0; i < distributions; i++) {
const value = Math.max(Math.round((amountLeft/(modifier || 4))),1)
amountLeft -= value
values.push(value)
}
// -------------------------------------------- //
// --- correct for cases where total values --- //
// --- end up greater/less than amount --- //
// -------------------------------------------- //
let iterator = 0
let totalAssignedValue = values.reduce((a,b) => a+b);
const lastIndex = (values.length - 1);
const getIndex = (iterator, values) => {
return iterator > lastIndex ? iterator % lastIndex : iterator
}
while (totalAssignedValue > amount) {
iterator = getIndex(iterator)
if (iterator !== lastIndex && iterator !== 0 && values[iterator] > 1) {
values[iterator]--
}
iterator ++
totalAssignedValue = values.reduce((a,b) => a+b);
}
while (totalAssignedValue < amount) {
iterator = getIndex(iterator)
if (iterator !== lastIndex && iterator !== 0) {
values[iterator]++
}
iterator ++
totalAssignedValue = values.reduce((a,b) => a+b);
}
// -------------------------------------------- //
// -------------- end correction -------------- //
// -------------------------------------------- //
return values;
}
最初の部分の試行をし、値を配信するが、常に私は大きい値で終わりますまたは入力量よりも少ないので、それを修正する方程式の2番目の部分があります。しかし、少し汚れているようですが、残りの部分がどのように分布するかは少し恣意的なので、純粋な数学的な解決策は素晴らしいでしょう。
私は基本的に積分(配列の値の合計)、積分の範囲(最小値と最大値)、そして現在ではこれを計算に必要としているのだろうかと思い始めています曲線の公式を把握しなければならない。しかし、これは現時点では過度なことかもしれません。
ありがとうございました!
あなたが知る必要があることは、JavaScriptが数値をどのように格納しているかで、計算が混乱する可能性があることです(例:0.1 + 0.2!== 0.3)。たとえば、[このページでは、この問題についていくつか説明しています](https://modernweb.com/what-every-javascript-developer-should-know-about-floating-points/)を参照してください。 –
よろしくお願いします。ありがとうございます! – stubbly
サンプル入力と期待される出力を含めると、大いに役立ちます。あなたは、最小値と最大値、その数と合計を指定したいとしますが、それらのためのパラメータではないようです。 – RobG