Функция, которая даёт каждый раз отличное число от предыдущего, на основе массива из чисел

Я сделал класс RandomNumber, при его инициализации ему даётся на вход массив из чисел.
В конструкторе сохраняется этот массив

constructor(numbers) {
  this.numbers = numbers.slice();
}

Я хотел сделать функцию в классе nextNumber, которая при вызове всегда даёт следующее число, которое отлично от предыдущего
К примеру: 0, 1, 0, 1, 0, 1, 0 будет, если в класс на вход дали массив из [0, 1]
Но мой код работает не так. Почему-то 1 никогда не повторяется, а 0 часто (а числа вообще не должны повторяться)

введите сюда описание изображения

class RandomNumber {

  constructor(numbers) {
    this.numbers = numbers.slice();
  }

  random(numbers) { // генерация рандомного числа на основе длины массива
    const randomIdx = Math.floor(Math.random() * numbers.length);
    const randomNumber = numbers[randomIdx];
    return {num: randomNumber, idx: randomIdx};
  };

  nextNumber() {
    const numbers = this.numbers.slice();
    let randomNumber = this.random(numbers);

    if (this.lastRdnNumber && this.lastRdnNumber.num === randomNumber.num) {
      // this.lastRdnNumber cуществует и прошлое число равняется текущему сгенерированному
      numbers.splice(this.lastRdnNumber.idx, 1); // вырезать число из массива, которое уже было
      randomNumber = this.random(numbers);
    }
  
    this.lastRdnNumber = randomNumber;
    return randomNumber.num;
  }
}

const numbers = [1, 0];
const randomNumber = new RandomNumber(numbers);

for (let i = 0; i < 30; i++) {
  console.log(randomNumber.nextNumber());
}


Ответы (1 шт):

Автор решения: Михаил Камахин

по совету @wololo надо было вырезать то число, которое я придумал, а не прошлое:

numbers.splice(randomNumber.idx, 1);

class RandomNumber {

  constructor(numbers) {
    this.numbers = numbers.slice();
  }

  random(numbers) { // генерация рандомного числа на основе длины массива
    const randomIdx = Math.floor(Math.random() * numbers.length);
    const randomNumber = numbers[randomIdx];
    return {num: randomNumber, idx: randomIdx};
  };

  nextNumber() {
    const numbers = this.numbers.slice();
    let randomNumber = this.random(numbers);

    if (this.lastRdnNumber && this.lastRdnNumber.num === randomNumber.num) {
      // this.lastRdnNumber cуществует и прошлое число равняется текущему сгенерированному
      numbers.splice(randomNumber.idx, 1); // вырезать число из массива, которое уже было
      randomNumber = this.random(numbers);
    }
  
    this.lastRdnNumber = randomNumber;
    return randomNumber.num;
  }
}

const numbers = [1, 0];
const randomNumber = new RandomNumber(numbers);

for (let i = 0; i < 30; i++) {
  console.log(randomNumber.nextNumber());
}

→ Ссылка