Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 阵列中的采样值具有良好的性能_Javascript_Performance - Fatal编程技术网

Javascript 阵列中的采样值具有良好的性能

Javascript 阵列中的采样值具有良好的性能,javascript,performance,Javascript,Performance,我有一个函数,它接受一个值数组和一个采样率。该函数应根据采样率随机删除值。例如,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);

我有一个函数,它接受一个值数组和一个采样率。该函数应根据采样率随机删除值。例如,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);
}
for(var i=values.length-1;i>=0;i--){
var rnd=Math.floor((Math.random()*100)+1);
如果(rnd<采样)
值。拼接(i,1);
}

但是我认为
Math.random()
函数不是性能上的选择。

如果您只想对整个数组的20%进行操作,那么实际上没有必要迭代整个数组。

循环n次,其中
n=Math.floor(0.20*originalArray.length)-1
并在每次迭代中删除它。

除非您需要支持较旧的浏览器,否则请使用以下方法:

var samplingPercentage=samplinggrate/100;
var filtered=values.filter(函数(){
返回Math.random()
首先,我需要澄清一下:是否要删除文本中描述的所有值的20%,或者删除每个值的概率为20%,这就是您在代码中所做的?它们是两种截然不同的东西。在任何情况下,都无法绕过
Math.random
,除非您编写自己的RNG,它几乎不会表现得更好。我对我的问题进行了编辑。这就像我在文本中写的一样。我不认为许多
splice
操作在彼此之后都有很好的性能(相比之下,
Math.random
调用应该可以忽略不计)。您可能想尝试一下(尽管这会创建一个新数组,而不是将它们从
值中删除)是否已编辑?我什么也没看到。你是说你的代码与问题无关吗?你能发布你解决问题的代码,而不是其他东西吗?不,不能。您的文本表示要删除20%的值。如果您有10.000个值,那么这意味着您将得到正好8.000个值。使用代码,您将拥有0到10.000之间的任意数量的值。这是一种很好的方法!当没有更好的方法时,我将使用并标记此作为答案。这将使前20%的值不是随机的20%。@RoToRa:不,他的意思是“移除一个随机元素(从整个数组中)n(=0.2*values.length)次”@Bergi想象一下,如果百分比为100,会发生什么。如果数组的长度为5,n在应该等于1的地方等于0。这就是为什么你不减去一。当你最终构建你的循环时,你应该使用n-1。这将以20%的概率移除元素,而不是移除20%的元素。我知道。但根据OP的评论,这似乎是OP想要的。我不确定。现在看评论,同样不确定,它是模糊的。对不起。我的意思是我想随机删除20%的元素。
var samplingPercentage = samplingRate / 100;

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