Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как сделать функцию, которая выбирает рандомные элементы массива?

Здравствуйте! Казалось бы банальщина, но не могу додуматься, как сделать функцию, которая будет принимать в качестве параметра количество возвращаемых элементов, и массив, из которого мы будем их вычленять (sorry)!

let arr = [ 1, 2, 3, 4, 5, 6, 7 ];
function getRandom( n, array ) { // n - число рандомных элементов,  из массива array
  // . . . код который позволит получить определённое количество элементов из массива array
};

getRandom( 3, arr ); // должно получиться например [4, 6, 7] или [1, 4, 6]

! ! ! Я написал реализацию данной функции, НО у неё есть минус , который я настоятельно прошу учесть

let arr = [1,2,3,4,5,6,7,8,9,10];

function getRandomRiver(n, a){
    let result = []; 
      for(let k=0; k<a.length; k++){
          if(!Math.round(Math.random())) result.push(a[k]); // Math.round(Math.random()) возвращает либо 0 либо 1, если 0 то мы добавляем этот элемент в массив
          if(result.length>=n) break; 
      };
    console.log(result);
};

getRandomRiver(3, arr);

Дело в том, что данная функция во 1ВЫХ может вернуть и меньшее количество , а во 2ЫХ, она каждый раз рассматривает элементы массива с 0го индекса, и шанс того, что в переменную result попадут элементы ближе к концу массива очень мал, а мне нужно, чтобы был полноценный рандом охватывающий весь массив! Спасибо заранее!
  • Вопрос задан
  • 729 просмотров
Решения вопроса 2
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

function getRandomRiver(n, arr) {
    const indexes = new Set();
    const limit = arr.length;
    n = Math.min(n, limit);
    while (indexes.size < n) {
        const index = Math.floor(limit * Math.random());
        indexes.add(index);
    }
    const result = [...indexes].map(index => arr[index]);
    return result;
};

const randomSet = getRandomRiver(3, arr);
console.log(randomSet);
Ответ написан
const getRandomRiver = (n, arr) => arr.sort(() => 0.5 - Math.random()).slice(0, n);

или
const getRandomRiver = (n, arr) => {
  return arr
    .map(x => ({ x, r: Math.random() }))
    .sort((a, b) => a.r - b.r)
    .map(a => a.x)
    .slice(0, n);
}


upd: или держите как хотели
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы