2014-08-30 46 views
2

我有一個函數,它需要一組值和一個採樣率。該函數應該隨採樣率去除值。例如,20%的採樣率應該消除20%的值。我如何才能以非常出色的性能實現這一目標,因爲我將迭代超過10,000個值?具有良好性能的陣列中的採樣值

我的想法是一樣的東西

for(var i = values.length-1; i >= 0; i--){ 
    var rnd = Math.floor((Math.random() * 100) + 1); 
    if(rnd < samplingRate) 
     values.splice(i,1); 
} 

但我認爲Math.random()功能沒有高性能的選擇。

+2

首先,我需要澄清:你想爲你描述刪除所有值的20%,在文字,或刪除每個值有20%的機會,這是你在代碼中做的事情嗎?他們是兩個完全不同的東西。在任何情況下,除非你編寫自己的RNG,否則'Math.random'沒有辦法,這幾乎不會有更好的表現。 – RoToRa 2014-08-30 12:31:15

+0

我做了一個編輯我的問題。這就像我在文中所寫的一樣。 – 2014-08-30 12:34:00

+0

我不認爲彼此之後有很多'splice'操作有很好的性能(相比之下'Math.random'調用應該可以忽略不計)。你可能想嘗試['filter'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)(儘管這會創建一個新的數組,而不是將它們從'values'中移除) – Bergi 2014-08-30 12:47:33

回答

1

如果你只想操作其中的20%,實際上不需要遍歷整個數組。
Loop for n times where n = Math.floor(0.20 * originalArray.length) - 1 and on each iteration get a random element from the array and remove it。

+0

好方法!當沒有更好的方法來做到這一點時,我將使用並標記爲答案。 – 2014-08-30 12:42:36

+1

爲什麼'-1'? – Bergi 2014-08-30 12:44:22

+0

這會使前20%的值不是隨機的20%。 – RoToRa 2014-08-30 12:45:17

1

除非你需要支持舊的瀏覽器使用.filter()方法:

var samplingPercentage = samplingRate/100; 

var filtered = values.filter(function() { 
    return Math.random() < samplingPercentage; 
}); 
+2

這將以20%的概率移除元素,而不是移除20%的元素。 – Nit 2014-08-30 13:02:03

+0

我知道。但根據他/她的意見,這似乎是OP想要的。我不確定。 – RoToRa 2014-08-30 13:04:06

+0

現在閱讀評論,同樣不確定,這是不明確的。 – Nit 2014-08-30 13:05:20

相關問題