例如,假设我有数组:[13,7,15,1,10,7,3,18,4,20],我有 2 个要求:
- 只选择元素 >10
- 随机化结果数组
正常做法:
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
要获得从 0
到 result.length
的随机整数且概率相等,请使用 Math.floor(Math.random() * (result .length + 1))
关于javascript - 如何在过滤元素期间随机化数组(不过滤数组然后随机化元素)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52378138/