Как рандомизировать массив во время фильтрующих элементов (НЕ фильтровать массив, а затем рандомизировать элементы)? - PullRequest
0 голосов
/ 18 сентября 2018

например, предположим, у меня есть массив: [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 голосов
/ 18 сентября 2018

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

...