@Adil1603

Почему рандомные элементы в массиве повторяются?

const random = function (min,max){
    let c = Math.floor(Math.random() * (max - min) + min);
    return c;
}
const NAMES = ['Иван', 'Marya', 'Gendalf', 'Rick'];
const SURNAMES = ['Sus', 'Ger', 'Gray', 'Graims'];
let NAMESS = [];

for (i=0;i<8;i++){
    let rand = NAMES[random(0,NAMES.length - 1)]+ " " + SURNAMES[random(0,NAMES.length - 1)]
    NAMESS.push(rand)
    if (NAMESS.includes(NAMESS[i])){
        if (rand !== NAMESS[i]){
        NAMESS.splice(0,i, rand)
        }
    }
}

Вначале в цикле я объявил переменную в которое записывается рандомное число. затем этот рандомное число записывается при помощи цикла 8 раз в массив NAMESS. Далее идет условие, что если в массиве NAMESS уже есть рандомный элемент текущей итерации, и подусловие если переменная rand не равно текущему элементу итерации, то элемент в массиве заменяется на переменную rand.

указав все это у меня в массиве все равно появляются одинаковые элементы. почему?
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Жуть. Вы создаёте элемент массива, потом проверяете, есть ли в массиве этот элемент, и если есть (а он там всегда есть, элемент массива всегда есть в этом массиве), но не последний (а каким ему быть, если его добавили только что), то удаляете все элементы массива и снова добавляете только что созданный.
const NAMESS = [];
while (NAMESS.length < 8) {
  const rand = `${NAMES[random(0, NAMES.length - 1)]} ${SURNAMES[random(0, SURNAMES.length - 1)]}`;
  if (!NAMESS.includes(rand)) {
    NAMESS.push(rand);
  }
}
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Предлагаю решение немного изменить, потому что работать со строками и искать их в уже собранных вариантах – долго и ненадёжно.

Вместо этого составить массив всех возможных уникальных пар индексов.
Этот массив «всех» вариантов перемешать. Например, красивым алгоритмом Фишера-Йейтса (или Кнўта). В массиве пар точно нет повторений, и порядок стал случайным.
Теперь осталось отрезать от этой колбасы кусок нужной длины. И заменить индексы словами.

spoiler
// перемешивает массив случайным образом
const shuffle = arr => {
  let currentIndex = arr.length, randomIndex;
  while (currentIndex > 0) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex--;
    [arr[currentIndex], arr[randomIndex]] = [arr[randomIndex], arr[currentIndex]];
  }
  return arr;
};

const getRandomPairs = (arrA, arrB, n) => {
  const [lengthA, lengthB] = [arrA.length, arrB.length];
  const indexPairs = [];
  for (let a = 0; a < lengthA; a++) {
    for (let b = 0; b < lengthB; b++) {
      indexPairs.push([a, b]);
    }
  }

  shuffle(indexPairs);

  indexPairs.length = Math.min(n, indexPairs.length);

  return indexPairs.map(pair => [arrA[pair[0]], arrB[pair[1]]].join(' '));
};

// использование
const NAMES = ['Иван', 'Marya', 'Gendalf', 'Rick'];
const SURNAMES = ['Sus', 'Ger', 'Gray', 'Graims'];

getRandomPairs(NAMES, SURNAMES, 8);

// [ "Rick Graims", "Marya Sus", "Gendalf Gray", "Gendalf Graims", "Gendalf Sus", "Marya Gray", "Иван Gray", "Rick Sus" ]
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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