Массив из случайных чисел
Всем привет! Помогите, пожалуйста, решить задачу Есть массив из 8 чисел [1,2,3,4,5,6,7,8] Задача - создать новый массив из 48 элементов , в который будут добавляться числа из этого массива в случайном порядке, но чтобы каждое число встретилось ровно 6 раз
Ответы (4 шт):
Автор решения: Алексей Шиманский
→ Ссылка
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)])
Автор решения: ΝNL993
→ Ссылка
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)
Автор решения: Stanislav Volodarskiy
→ Ссылка
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(' '));
Автор решения: UModeL
→ Ссылка
- Создаём новый массив с нужной размерностью (количеством повторений);
- Заполняем новый массив, используя в качестве значения исходный массив;
- Преобразуем новый массив в одномерный (убираем вложенность);
- Делаем примитивную сортировку.
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) );