Массив из случайных чисел

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

Всем привет! Помогите, пожалуйста, решить задачу Есть массив из 8 чисел [1,2,3,4,5,6,7,8] Задача - создать новый массив из 48 элементов , в который будут добавляться числа из этого массива в случайном порядке, но чтобы каждое число встретилось ровно 6 раз

Ответы

▲ 1

let arr = [1,2,3,4,5,6,7,8]
let sixTimesArr = [...arr, ...arr, ...arr, ...arr, ...arr, ...arr];

function* shuffle(arr) {
  let newArr = [...arr];
  while(newArr.length) yield newArr.splice(Math.random() * newArr.length|0, 1)[0]
  
  return newArr;
}

document.write([...shuffle(sixTimesArr)])

▲ 1

repeat n раз повторяет массив a.

shuffle случайным образом перемешивает массив. Алгоритм Фишера-Йейтса:

const repeat = (n, a) => [].concat(...Array(n).fill(a));

const shuffle = a => {
    for (let i = 1; i < a.length; ++i) {
        const j = Math.floor(Math.random() * (i + 1));  // random in [0, i]
        [a[i], a[j]] = [a[j], a[i]];  // swap a[i] <-> a[j]
    }
};

const a = repeat(6, [1, 2, 3, 4, 5, 6, 7, 8])
console.log(a.join(' '));
shuffle(a);
console.log(a.join(' '));

▲ 0

const data = [1, 2, 3, 4, 5, 6, 7, 8]
const repeat = 6

function getRandomArr(arr, repeatsAmount) {
  let newArr = []
  const initialArr = arr // Сохраняем оригинальный массив в новой переменной т.к. в последующем он (оригинальный массив) будет мутировать

  for (let i = 0; i < repeatsAmount; i++) {
    arr = initialArr.concat() // Используем concat, чтобы избежать мутаций

    for (let j = 0; j < initialArr.length; j++) {
      const currentIndex = Math.floor(Math.random() * arr.length) // Случайный элемент массива
      const currentItem = arr[currentIndex] // Сохраняем число
      arr = arr.filter((_, i) => i !== currentIndex) // Убираем число уже сохранённое в переменной

      newArr.push(currentItem)
    }
  }

  return newArr
}

const newArr = getRandomArr(data, repeat)

// data = массив чисел из которого будет составляться новый массив
// repeat = мин. кол-во раз которое число должно повториться в массиве

document.write('Длина массива: ' + newArr.length)
document.write(' ')
document.write(newArr)

▲ 0
  1. Создаём новый массив с нужной размерностью (количеством повторений);
  2. Заполняем новый массив, используя в качестве значения исходный массив;
  3. Преобразуем новый массив в одномерный (убираем вложенность);
  4. Делаем примитивную сортировку.

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

let fDuplicateArrayElems = (a, n) => new Array(n) // 1
  .fill(a) // 2
  .flat() // 3
  .sort(() => Math.random() - .5); // 4

console.log( fDuplicateArrayElems(arr, 6) );