JS, как сделать, чтобы рандом не повторялся?

Рейтинг: 1Ответов: 2Опубликовано: 20.07.2023

Пытаюсь реализовать игру, где выдается картинка и четыре варианта ответов, один из которых верный. Как написать или переписать функцию, чтобы рандомно выпадающая в поле field картинка не повторялась, пока не закончится основной массив с объектами actress? Я только обучаюсь, поэтому буду признательна, если опишете логику и пример решения как можно более простым языком.

function getStarted() {
    let arr = [];

    function random(max, count) {

        while (arr.length < count) {
            let j = (Math.floor(Math.random() * max));
            if (!arr.includes(j)) {
            arr.push(j); 
            }
        } 
        
    }
    random(actress.length, 4);

    function getRandom () {
    
        let rand = Math.floor(Math.random() * arr.length);
        a = actress[arr[0]].name;
        b = actress[arr[1]].name;
        c = actress[arr[2]].name;
        d = actress[arr[3]].name;
        image = actress[arr[rand]].photo;
        descr = actress[arr[rand]].name;
    }
    getRandom();

    function beginning () {
        firstBtn.innerHTML = a;
        secondBtn.innerHTML = b;
        thirdBtn.innerHTML = c;
        fourthBtn.innerHTML = d;
        field.innerHTML = `<img src=${image} alt=${descr}>`;
    }    
    beginning();
}

start.addEventListener('click', () => {
    
    getStarted(); 
    
});

Ответы

▲ 3
  1. Берём массив
  2. Перемешиваем его каим-либо образом с самого начала
  3. Далее просто берём элементы по порядку из перетасованного массива.
▲ 1

Вариант Алексея самый оптимальный. Но приведу так же свой алгоритм.

  1. Создаем массив в котором будут хранится уже "использованные" элементы вашего массива с вариантами ответа
  2. Берем рандомный вариант ответа
  3. Проверяем, что его еще нет в массиве с "использованными" вариантами
  4. Сохраняем его в наш массив для "использованных" элементов

у вас в принципе такая схема в методе random реализована

if (!arr.includes(j))