Есть функция, которая выводит рандомные числа от 1 до 4. Как сделать так, чтобы предыдущее число не выводилось опять. То есть не может к примеру выпасть 1, а потом опять 1, а должна быть другая цифра:
let getRandomNumber = (min, max) => {
let number = Math.floor(min + Math.random() * (max - min));
return number;
};
getRandomNumber(1, 5);
Практически то же, что у @Igor, но через генератор:
function * getRandomInt(from, to) {
if (to - from < 2) throw 'Incorrect interval';
let prev, cur;
while (true) {
while (prev == cur) {
cur = Math.floor(from + Math.random() * (to - from));
}
yield cur;
prev = cur;
}
}
let rnd = getRandomInt(1, 5);
let numbers = [];
for (let i = 0; i < 20; i++) {
numbers.push(rnd.next().value);
}
console.log(numbers + '');
const numbers = []
const getRandomNumber = (min, max) => {
const number = Math.floor(min + Math.random() * (max - min))
if (numbers.includes(number)) return getRandomNumber(min, max)
else {
numbers.push(number)
return number
}
}
console.log(getRandomNumber(1, 5))
console.log(getRandomNumber(1, 5))
console.log(getRandomNumber(1, 5))
console.log(getRandomNumber(1, 5))
Мой вариант такой - создавать массив с числами из заданного промежутка, перемешать его и выдавать по одному числу.
const getNotRepeatRandomNumber = (min, max) => {
const shuffle = (arr) => {
let j, temp;
for(var i = arr.length - 1; i > 0; i--){
j = Math.floor(Math.random()*(i + 1));
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
return arr;
}
let array = [];
for (let index = min; index <= max; index++) {
array.push(index);
}
array = shuffle(array);
return () => array.shift();
};
const getRandomNumber = getNotRepeatRandomNumber(1, 4);
console.log(getRandomNumber());
console.log(getRandomNumber());
console.log(getRandomNumber());
console.log(getRandomNumber());
Если же вам нужно чтобы не повторялись только 2 соседних числа, то возможно вам подойдет такой вариант
let getNotRepeatRandomNumber = (min, max) => {
let lastNumber;
const getRandomNumber = () => Math.floor(min + Math.random() * (max - min));
const result = () => {
const number = getRandomNumber();
if (number === lastNumber) {
return result();
}
lastNumber = number;
return number;
};
return result;
};
const getRandomNumber = getNotRepeatRandomNumber(1, 4);
console.log(getRandomNumber());
console.log(getRandomNumber());
console.log(getRandomNumber());
console.log(getRandomNumber());
let getRandomNumber = (min, max) => {
let last = getRandomNumber.last;
let result = last;
while (result == last) {
result = Math.floor(min + Math.random() * (max - min));
}
getRandomNumber.last = result;
return result;
};
var a = [];
for (var i = 0; i < 25; i++)
a.push(getRandomNumber(1, 5));
console.log(JSON.stringify(a));
let getRandomNumber = (min, max, used) => {
while(true){
let number = Math.floor(min + Math.random() * (max - min));
if(!used.some(el => el === number)){
used.push(number);
return number;
}
}
};
const usedValues = [];
getRandomNumber(1, 5, usedValues);
Хз, мне так проще
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как получить область видимости[scope] LexicalEnvironment с одной функции в другую?
Столкнулся с проблемой (не ожидаемым поведением) в ФФ, когда определенный код выполнялся после formsubmit(), хотя казалось, что этого не должно...