如果我有一個數字陣列并且我想得到最接近平均值的數字,我怎樣才能得到那個數字?
我嘗試按升序對陣列進行排序,然后檢索中間元素,即平均值。
注意:我使用Math.floor()的情況是如果陣列的長度是奇數而不是偶數
const arr = [1, 6, 10, 3, 15, 9, 4, 7];
const arrSorted = arr.sort((a,b)=>a-b);
const nearToAVG = arrSorted[Math.floor(arr.length/2)];
console.log(nearToAVG); // 7
有沒有更好的方法讓陣列中的數字接近平均值?
uj5u.com熱心網友回復:
讓我們剖析一下這個問題。您希望索引與陣列索引的平均值最接近。為此,您可以首先計算陣列的總和。知道總和后,您可以對陣列進行第二次掃描,arr以獲取每個元素與平均值的差并將其存盤在變數中。最后,如果平均值和當前索引之間的差異比存盤值更接近零,您將更新該變數。在陣列的末尾,您將得到您正在尋找的答案。
這是上面的一個簡單示例:
const arr = [1, 6, 10, 3, 15, 9, 4, 7];
// get average
let sum = 0;
for(let i = 0; i < arr.length; sum = arr[i], i );
let ave = sum / arr.length; // 6.875
function nearestIdxToAverage(array, average) {
if(!array.length) return 0;
// stores initial difference and gets replaced by index
let nearest = Math.abs(array[0] - average);
for(let i = 0; i < array.length; i ) {
const diff = Math.abs(array[i] - average);
// stores the offset of the diff closest to 0 (relative to the average)
nearest = (diff < nearest)? i: nearest;
}
return nearest;
}
console.log(`average: ${ave}\nnearest idx: ${nearestIdxToAverage(arr, ave)}`);
// average: 6.875
// nearest idx: 7
uj5u.com熱心網友回復:
正如我在對另一個答案的評論中指出的那樣,這是其中一種情況,當您確實需要比“平均”更精確時。Themedian和 themean是最常見的平均值,根據您的需要,您可能會得到不同的答案。例如,在 中[3, 20, 1, 4, 2],中位數是3,但是由于均值是6,因此最接近均值的原始值是4。
此版本假設您想要獲得最接近數字算術平均值的陣列中的值:
const closestToMean = (ns, m = ns .reduce ((a, b) => a b, 0) / ns .length) =>
ns .reduce ((c, n) => Math .abs (n - m) < Math .abs (c - m) ? n : c, Infinity)
console .log (closestToMean ([3, 20, 1, 4, 2]))
console .log (closestToMean ([1, 6, 10, 3, 15, 9, 4, 7]))
我們將數字相加并除以它們的長度以找到平均值,然后我們折疊數字串列,在每個階段保持更接近該平均值的那個。
實際上,我更愿意將其分解并提取公共輔助函式sum,它總計一個數字陣列,mean用于sum計算算術平均值,以及minimumBy根據應用函式的結果找到陣列的最小元素提供給每個元素。我認為這個版本更具可讀性:
const sum = (ns) =>
ns .reduce ((a, b) => a b, 0)
const mean = (ns) =>
sum (ns) / ns .length
const minimumBy = (fn) => (ns) =>
ns .reduce ((c, n) => fn (n) < fn (c) ? n : c, Infinity)
const closestToMean = (ns, m = mean (ns)) =>
minimumBy (n => Math .abs (n - m)) (ns)
console .log (closestToMean ([3, 20, 1, 4, 2]))
console .log (closestToMean ([1, 6, 10, 3, 15, 9, 4, 7]))
...而且我們還偶然發現了一些有用的功能,可以在這個程式的其他地方或其他地方使用。
uj5u.com熱心網友回復:
另一種實作這一目標的方法通過使用:
reduce將總和除以它的長度得到平均值。map遍歷該陣列并回傳每個數字及其nearByAVG (該數字與平均值之間的距離)。sort按該屬性升序并獲得第一個具有最小平均距離的屬性。
const arr = [1, 6, 10, 3, 15, 9, 4, 7];
const sum = arr.reduce((acc, curr)=>acc curr);
const avg = sum/arr.length;
const arrMaped = arr.map(num=>({num,nearByAVG: Math.abs(num-avg)}));
const arrSorted = arrMaped.sort((a,b)=>a.nearByAVG-b.nearByAVG);
console.log(arrSorted[0].num)
uj5u.com熱心網友回復:
您應該將所有數字相加并除以陣列的長度。除此之外,排序陣列中心的數字不是數字的平均值,只是中位數。
let numArray=[12,32,134,23,54,345,32,1]; //all elements numbers
let num=0;
for(let number of numArray) {num =number};
num/=numArray.length
console.log(num)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464246.html
標籤:javascript 数组 算法 数学
