JavaScript - генерирует случайное число от 1 до 5, но никогда не повторяет одно и то же число дважды подряд - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть простой код для генерации случайного числа от 1 до 5.
В зависимости от того, какое число вытащено, будет воспроизводиться определенный звуковой файл.Тем не менее, как я могу помешать этой простой программе генерировать одно и то же число два раза подряд, в результате чего один и тот же звук будет воспроизводиться дважды?
Например: бросок игральных костей никогда не бывает одинаковым дважды подряд, то есть вы не можете бросить2, если вы просто бросили 2 и т. Д.

Я экспериментировал с утверждениями if else и как бы загнал себя в угол.Я знаю, что это может показаться простой проблемой, но я в своем уме на этом.

<!DOCTYPE html>
<html>
<body>

  <p>Click the button to display a random number between 1 and 5.</p>

  <button onclick="myFunction()">ROLL DICE</button>

  <p id="demo"></p>

  <script>
    function myFunction() {
      var x = Math.floor((Math.random() * 5) + 1);
      document.getElementById("demo").innerHTML = x;
    }
  </script>
</body>
</html>

Ответы [ 7 ]

0 голосов
/ 27 сентября 2018

Простой математический трюк для исключения излишних случайных звонков:

В первый раз генерируем случайные в диапазоне 1..5

В следующий раз вызываем случайные в диапазоне 1 ..4 , добавьте его к текущему значению и используйте операцию по модулю - чтобы сохранить диапазон результатов 1..5, но исключить текущее значение

Код (обратите внимание, что в диапазоне 0 используется x..4 но вывод смещается на единицу для упрощения математики)

var s = ""
var x = Math.floor((Math.random() * 5));
for (i = 0; i < 40; i++) {
  s = s + (x + 1) + " "
  x = (x + Math.floor((Math.random() * 4) + 1 )) % 5;   
}
print(s)

1 4 3 2 1 5 4 5 2 1 4 2 4 5 1 4 3 1 4 5 2 1 3 5 2 4 5 3 1 5 3 5 4 5 1 5 3 5 4 2
0 голосов
/ 30 мая 2019

Вот функция, которую вы можете использовать.Все довольно просто:

min: минимальный диапазон;max: максимальная дальность;длина: сколько чисел генерировать.

Функция и использование:

const randomUniqueNumbers = (min, max, length=1) => 
{
    const limit = max-min+1;
    if (min > max || max < min){
       throw new Error(`Parameter "min" has to be smaller than "max" and vice-versa.`)
    }
    else if (length > limit){
      throw new Error(`The length between ${min} and ${max} cannot exceed ${limit}.`)
    }

    let uniqueNumbers = [];
    let number;
    for(var i=0; i<length; i++){
        do
            number = Math.floor(Math.random() * limit) + min;
        while(uniqueNumbers.indexOf(number) !== -1);

       uniqueNumbers[i] = number;
    }

    return uniqueNumbers;
}

console.log(randomUniqueNumbers(20, 30, 3)); //[24, 27, 26]
console.log(randomUniqueNumbers(100, 1000, 5)) //[865, 438, 798, 247, 232]
console.log(randomUniqueNumbers(1, 5, 5)) //[5, 2, 1, 3, 4]
0 голосов
/ 27 сентября 2018
<!DOCTYPE html>
<html>
<body>

<p>Click the button to display a random number between 1 and 5.</p>

<button onclick="myFunction()">ROLL DICE</button>
<span id="previousNumber" style="display:none"></span>
<p id="demo"></p>

<script>
function myFunction() {
  var x = getRandomNum();
  var temp = document.getElementById("previousNumber").innerHTML;
  while(x == temp){
      x = getRandomNum();
  }
  document.getElementById("demo").innerHTML = x;
  document.getElementById("previousNumber").innerHTML = x;
}

function getRandomNum(){
    var x = Math.floor((Math.random() * 5) + 1);
    return x;
}
</script>

0 голосов
/ 27 сентября 2018
var curr = 0; 

function myFunction() {
  var x = Math.floor((Math.random() * 5) + 1);

  if(x == curr) {
    myFunction();
  }
  else {
    curr = x; 

    document.getElementById("demo").innerHTML = x;
  }
}

Это следует сделать, если вы не возражаете против использования глобальной переменной.

Демо: http://jsfiddle.net/jkrb837p/1/

0 голосов
/ 27 сентября 2018

var lastRoll = null;
function myFunction() {
  var thisRoll = lastRoll;
  while (thisRoll === lastRoll) {
    thisRoll = Math.floor((Math.random() * 5) + 1);
  }
  document.getElementById("demo").innerHTML = thisRoll;
  lastRoll = thisRoll;
}
<p>Click the button to display a random number between 1 and 5.</p>

<button onclick="myFunction()">ROLL DICE</button>

<p id="demo"></p>
0 голосов
/ 27 сентября 2018

Как насчет создания списка для выбора с последним удаленным номером?

lastNumber = 0; // Initialize it to a number outside the list so first pick is from full five.
sourceList = [1,2,3,4,5];

function noRepeatRandom(){
    nextList = sourceList.filter(function(x){return x!=lastNumber});
    randomIndex = Math.floor(Math.random() * nextList.length);
    lastNumber = nextList[randomIndex] 
    return lastNumber
}

Это должно выбрать из целых пяти для первого вызова.

0 голосов
/ 27 сентября 2018

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

let lastNumber // start with undefined lastNumber

function getRandNumber() {
  var x = Math.floor((Math.random() * 5) + 1); // get new random number

  if (x === lastNumber) { // compare with last number
    return getRandNumber() // if they are the same, call the function again to repeat the process
  }
  return x // if they're not the same, return it
}
function myFunction() {
   const number = getRandNumber()
   lastNumber = number 
   document.getElementById("demo").innerHTML = number;
}
...