Функция, которая даёт каждый раз отличное число от предыдущего, на основе массива из чисел
Я сделал класс 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());
}
