Рандомные числа от 1 до 5 без повторения 2 раза подряд

120
24 августа 2019, 22:20

Есть функция, которая выводит рандомные числа от 1 до 4. Как сделать так, чтобы предыдущее число не выводилось опять. То есть не может к примеру выпасть 1, а потом опять 1, а должна быть другая цифра:

let getRandomNumber = (min, max) => {
    let number = Math.floor(min + Math.random() * (max - min));
    return number;
};
getRandomNumber(1, 5);
Answer 1

Практически то же, что у @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 + '');

Answer 2

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))

Answer 3

Мой вариант такой - создавать массив с числами из заданного промежутка, перемешать его и выдавать по одному числу.

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());

Answer 4

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));

Answer 5
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);

Хз, мне так проще

READ ALSO
Как получить область видимости с одной функции в другую?

Как получить область видимости с одной функции в другую?

Как получить область видимости[scope] LexicalEnvironment с одной функции в другую?

100
Отображение объекта при нажатии [дубликат]

Отображение объекта при нажатии [дубликат]

На данный вопрос уже ответили:

128
Метод submit у формы асинхронен?

Метод submit у формы асинхронен?

Столкнулся с проблемой (не ожидаемым поведением) в ФФ, когда определенный код выполнялся после formsubmit(), хотя казалось, что этого не должно...

77
JS - Замена символов в файле [закрыт]

JS - Замена символов в файле [закрыт]

Есть файл, который содержит:

83