【问题标题】:JavaScript - Generate a random number between 1 and 5, but never the same number twice consecutivelyJavaScript - 生成 1 到 5 之间的随机数,但绝不会连续两次生成相同的数字
【发布时间】:2019-03-02 20:11:49
【问题描述】:

我有一些简单的代码可以生成 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>

【问题讨论】:

  • 只用一个变量来存储之前的数字

标签: javascript if-statement math random


【解决方案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;
}

【讨论】:

    【解决方案2】:

    如何创建一个列表以从中选择并删除最后一个数字?

    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
    }
    

    这应该从完整的五个中选择第一次调用。

    【讨论】:

      【解决方案3】:

      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>

      【讨论】:

        【解决方案4】:
        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/

        【讨论】:

          【解决方案5】:
          <!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>
          

          【讨论】:

            【解决方案6】:

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

            第一次在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
            

            【讨论】:

              【解决方案7】:

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

              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]
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-12-31
                • 2014-04-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-10-02
                相关资源
                最近更新 更多