如何用JavaScript根據(jù)總數(shù)將隨機數(shù)平均分配到不同大小的分組中,并避免出現(xiàn)負數(shù)?

如何用JavaScript根據(jù)總數(shù)將隨機數(shù)平均分配到不同大小的分組中,并避免出現(xiàn)負數(shù)?

利用JavaScript將隨機數(shù)平均分配到不同大小的分組中,并避免負數(shù)

本文探討一個javascript編程難題:如何根據(jù)總數(shù)量,將隨機數(shù)平均分配到大小不同的分組中,且避免出現(xiàn)負數(shù)。我們將分析問題根源,并提供改進的解決方案。

問題描述:已知一個數(shù)組arr,每個對象的test屬性代表分組大小:

let arr = [   { id: 1, test: 6 }, // 分組1包含6個數(shù)   { id: 2, test: 4 }, // 分組2包含4個數(shù)   { id: 3, test: 5 }, // 分組3包含5個數(shù) ];

test屬性值的總和為15。我們需要根據(jù)給定的總數(shù)(例如29),生成15個隨機數(shù),并平均分配到這15個分組中。 原始代碼嘗試通過計算平均值分配,但存在后期出現(xiàn)負數(shù)的問題。

立即學習Java免費學習筆記(深入)”;

原始代碼的問題在于,它在計算步長后,沒有動態(tài)調整剩余總數(shù)和步長,導致分配不均,最終出現(xiàn)負數(shù)。

改進后的代碼如下:

function distributeRandomNumbers(list, totalNumbers = 29) {   const data = list.map((item) =>      Array.from({ length: item.test }).map(() => ({ min: 0, max: 0, num: 0 }))   );    let remainingNumbers = totalNumbers;   let totalGroups = list.reduce((sum, item) => sum + item.test, 0);    for (let i = 0; i < list.length; i++) {     for (let j = 0; j < list[i].test; j++) {       const step = math.floor(remainingNumbers / totalGroups); // 下取整       const randomNumber = Math.floor(Math.random() * (step + 1)); // 生成0到step之間的隨機數(shù)       data[i][j].num = randomNumber;       remainingNumbers -= randomNumber;       totalGroups--;     }   }   return data; }

改進后的代碼核心在于:

  1. 動態(tài)調整: 在每次分配隨機數(shù)時,都重新計算remainingNumbers和totalGroups,確保剩余的隨機數(shù)在剩余的分組中平均分配。
  2. 下取整: 使用Math.floor()確保步長是整數(shù),避免浮點數(shù)運算導致的誤差。
  3. 避免負數(shù): 通過生成0到step之間的隨機數(shù),確保不會出現(xiàn)負數(shù)。

此改進后的代碼能夠更有效地將隨機數(shù)分配到不同大小的分組中,并有效避免負數(shù)的出現(xiàn),保證了分配的公平性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享