如何在DURING过滤器元素中随机化数组(NOT过滤器然后将元素随机化)?

时间:2018-09-18 02:42:18

标签: javascript arrays algorithm random

例如,假设我有数组:[13,7,15,1,10,7,3,18,4,20],我有2个要求:

  1. 仅选择元素> 10
  2. 随机化结果数组

正常方法:

let arr=[13,7,15,1,10,7,3,18,4,20];
let result=[];
for(let i=0;i<arr.length;i++){
    if(arr[i]>10){
      result.push(arr[i]);
    }
}

for(let i=0;i<result.length;i++){
  const r=Math.floor(Math.random()*result.length);
  const temp=result[i];
  result[i]=result[r];
  result[r]=temp;
}
for(let i=0;i<result.length;i++){
    console.log(result[i]);
}

但是我相信我可以用更简单的方式做到这一点:我可以在过滤期间将其放置在随机位置,而不是在获得所有结果后将整个数组随机化,我尝试过:

let arr=[13,7,15,1,10,7,3,18,4,20];
let result=[];
for(let i=0;i<arr.length;i++){
    if(arr[i]>10){
      result.splice(Math.floor(Math.random()*result.length),0,arr[i]);
    }
}

for(let i=0;i<result.length;i++){
    console.log(result[i]);
}

但是我发现它不起作用:最后一个元素始终为13:

18
20
15
13

20
15
18
13

这个想法有什么问题?

1 个答案:

答案 0 :(得分:6)

Math.random()总是小于1.0(即使包​​含1.0,也几乎不可能得到一个)。因此,Math.floor(Math.random()*result.length)从不等于result.length,因为您使用floor()。这意味着您永远不会在最后一个现有元素之后的位置插入新元素,而最后一个现有元素始终是您添加的第一个元素,即13

要获取从0result.length(含)和相等概率的随机整数,请使用Math.floor(Math.random() * (result.length + 1))