Задать вопрос

Как сделать рандомный массив из 40 уникальных элементов?

Сначала подумал что можно рандомизированный массив засунуть в set, но как на выходе получить конкретное количество элементов не понял.
  • Вопрос задан
  • 382 просмотра
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Сначала подумал что можно рандомизированный массив засунуть в set...

Надо наоборот - сначала set, потом массив (только осторожно - если интервал возможных значений меньше желаемой длины, то цикл получится бесконечным; надо или уменьшить длину, или кидать ошибку):

function createRandomArr(size, min, max) {
  if (size > (max -= ~-min)) {
    throw 'невозможно создать массив указанного размера';
  }

  const values = new Set;
  for (; values.size < size; values.add(min + Math.random() * max | 0)) ;
  return [...values];
}

const arr = createRandomArr(40, 1, 100);

Но вообще, есть и другие способы.

Например, можно создать массив со всеми возможными значениями, и выдёргивать из него элементы случайным образом, сколько надо:

function createRandomArr(size, min, max) {
  const len = max - min + 1;
  const arr = [...Array(len).keys()];

  return Array.from(
    { length: Math.min(size, len) },
    () => min + arr.splice(Math.random() * arr.length | 0, 1)[0]
  );
}

Или, создать массив со всеми возможными значениями, перемешать его, взять кусок нужного размера:

function createRandomArr(size, min, max) {
  const arr = Array.from(
    { length: max - min + 1 },
    (_, i) => i + min
  );

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

  return arr.slice(-size);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы