例如,假设我有数组:[13,7,15,1,10,7,3,18,4,20],我有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
这个想法有什么问题?
答案 0 :(得分:6)
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))