利用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; }
改進后的代碼核心在于:
- 動態(tài)調整: 在每次分配隨機數(shù)時,都重新計算remainingNumbers和totalGroups,確保剩余的隨機數(shù)在剩余的分組中平均分配。
- 下取整: 使用Math.floor()確保步長是整數(shù),避免浮點數(shù)運算導致的誤差。
- 避免負數(shù): 通過生成0到step之間的隨機數(shù),確保不會出現(xiàn)負數(shù)。
此改進后的代碼能夠更有效地將隨機數(shù)分配到不同大小的分組中,并有效避免負數(shù)的出現(xiàn),保證了分配的公平性。
? 版權聲明
文章版權歸作者所有,未經(jīng)允許請勿轉載。
THE END