ランダムに「バランスのとれた」結果が毎回必要な場合は、バランスまたはランダムのいずれかに優先順位を付ける必要があります。ここにあなたの "widestGapの要件以下の一つの可能な解決策があります:
function randomDeltas(length, widestGap, remToGet) {
// widestGap >= length * 2 - 1
let deltas = [];
let sum = 0;
let start = 0;
let origLength = length;
while (length--) {
start += 1 + Math.floor(Math.random() * widestGap);
deltas.push(start);
sum += start;
}
let rem = sum % origLength;
let correction = remToGet - rem;
if (correction !== 0) {
sum -= deltas[0];
deltas[0] += correction;
if (deltas[0] >= deltas[1]) {
deltas[0] -= origLength;
}
else if (deltas[0] < deltas[1] - widestGap) {
deltas[0] += origLength;
}
sum += deltas[0];
}
return {
deltas,
sum
};
}
function randomDistinctDistribute(apples, people) {
let rem = apples % people;
let { deltas, sum } = randomDeltas(people, people * 2 - 1, rem);
let div = (apples - sum)/people;
let distribution = [];
while (deltas.length) {
distribution.push(div + deltas.shift());
}
return distribution;
}
console.log(randomDistinctDistribute(5000, 8));
console.log(randomDistinctDistribute(2500, 6));
ここでの考え方は、デルタをランダム化する(ギャップが大きくなったことがないことを確認するため)、その後、除数にそれらのデルタを適用しています。ここで
は異なる値とバランスの取れた分布を得るために、元の(決定論的)なアプローチです:
function distinctDividents(apples, people) {
let distribution = [];
let div = Math.floor(apples/people);
let rem = apples % people;
if (people % 2) {
distribution.push(div);
people--;
}
let half = people/2;
let i = 1;
while (i <= half) {
distribution.push(div - i);
distribution.unshift(div + i);
i++;
}
if (rem) {
distribution[0] += rem;
}
return distribution;
}
console.log(distinctDividents(5000, 8));
リンゴの80%を取り、それらを均等に分けて、最後の20%をランダム化することができます。味を調整する。 –
あなたはまた、人数に基づいてリンゴの最低割合を設定することもできます。var minPercentage =(100/people) - 10 //または分散を希望するものは、1人あたりのリンゴが等しいか、最小パーセンテージ。それらを格納し、何かを印刷する前に小切手を実行するための配列が必要です。 – Danimal
私はあなたがそれをやる方法の例を教えてくれますか? – Endless