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

问题描述 投票:0回答:1

例如,假设我有数组:[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

这个想法有什么不对?

javascript arrays algorithm random
1个回答
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))

© www.soinside.com 2019 - 2024. All rights reserved.