javascript - 如何在过滤元素期间随机化数组(不过滤数组然后随机化元素)?

标签 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

这个想法有什么问题吗?

最佳答案

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))

关于javascript - 如何在过滤元素期间随机化数组(不过滤数组然后随机化元素)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52378138/

相关文章:

javascript - 防止用户离开未保存的更改

javascript - Vue.js net::ERR_INCOMPLETE_CHUNKED_ENCODING Webpack 错误

javascript - 似乎无法将片段移动到重复字段中

C++ 数组操作(类似 python 的操作)

javascript - 如何突出显示任意数量的(可能重复的)A,后跟非贪婪匹配器,然后是任意数量的 B 等(没有不合理的限制)?

c - 如何在 C 中随机选择多个不同的数组元素?

java - 从文本文件创建二维数组

php - 更快的 Aho-Corasick PHP 实现

algorithm - 在 SPOJ 上寻找 MARTIAN 的 DP 解决方案的失败测试用例

java - 在不将它们存储到内存中的情况下一一获得组合的算法