массив состоящий из рандомных элементов(чисел), каждый элемент это число от 0 до 8

Рейтинг: 0Ответов: 4Опубликовано: 08.04.2023

Как сделать функцию которая возвращает массив состоящий из трех элементов, каждый элемент это рандомное число от 0 до 8 и что-бы эти три элемента(числа) не повторялись между собой.

Например:

let arr = [3,1,8]
let arr = [7,4,6]
let arr = [5,0,2]

и т.д.

Ответы

▲ 1Принят
  1. Заполнить массив значениями от 0 до 8
  2. Перемешать
  3. Орезать первые последние 6 значений (чтобы в массиве осталось три)
  4. PROFIT
▲ 1

Вырезать из массива рандомно по одному элементу.

function getA3(){
  const a = [...Array(9).keys()]
  const b = Array(3)
  let count = 3
  while(--count >= 0) { b[count] = a.splice(Math.floor(Math.random() * a.length), 1)[0]  }
  return b
}

console.log(JSON.stringify(getA3()));
console.log(JSON.stringify(getA3()));
console.log(JSON.stringify(getA3()));

Оставить рандомно 3 элемента

function getA3(){
  const a = [...Array(9).keys()]
  let count = 6
  while(--count >= 0) { a.splice(Math.floor(Math.random() * a.length), 1) }
  return a
}

console.log(JSON.stringify(getA3()));
console.log(JSON.stringify(getA3()));
console.log(JSON.stringify(getA3()));

▲ 1

Решил так:

function myArr(num){
   
   let newArr = Array(num).fill().map((e, i) => i + 1)

   for (let i = newArr.length - 1; i > 0; i--) {
      let j = Math.floor(Math.random() * (i + 1));
      [newArr[i], newArr[j]] = [newArr[j], newArr[i]];
    }

   return newArr.splice(0, 3)
}
console.log(myArr(8));
▲ 0

Вариант Фишера-Йейтса:

const sample = (n, k) => {
    const a = [...Array(n).keys()];
    for (let i = 0; i < k; ++i) {
        const j = i + Math.floor(Math.random() * (n - i));  // random in [i, n)
        [a[i], a[j]] = [a[j], a[i]];                        // swap a[i], a[j]
    }
    return a.slice(0, k);
};

for (let k = 0; k < 10; ++k) {
    console.log(sample(9, 3).join(' '));
}