JavaScript-生成1到5之间的随机数,但不会连续两次生成相同的数字

时间:2018-09-27 01:15:42

标签: javascript if-statement math random

我有一些简单的代码可以生成1到5之间的随机数。
根据要拉的号码,将播放某个声音文件。但是,如何防止这个简单的程序连续两次生成相同的数字,从而使相同的音频播放两次?
例如:一掷骰子从未连续两次相同,这意味着如果只掷2等,就不能掷2。

我正在尝试if语句,并且有点支持自己。我知道这似乎是一个简单的问题,但是我不知所措。

<!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 :(得分:1)

您需要获取一个新号码并与旧号码进行比较,如果相同,则获取一个新号码并重复。稍微递归可以在这里有所帮助!

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

答案 1 :(得分:0)

如何创建一个列表以从中删除最后一个号码作为选择?

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
}

这应该从第一个电话的全部五个电话中选择。

答案 2 :(得分:0)

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>

答案 3 :(得分:0)

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/

答案 4 :(得分:0)

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

答案 5 :(得分:0)

简单的数学技巧可以排除过多的随机调用:

第一次生成范围为1..5的随机

下次调用范围为 1..4 的随机数时,将其添加到当前值并使用取模运算-保留结果范围1..5但不包括当前值

Code(请注意,它在0..4范围内使用x,但输出会移动1以简化数学)

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

答案 6 :(得分:0)

这是您可以使用的功能。这很简单:

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]