【问题标题】:the sequence of If statementIf语句的顺序
【发布时间】:2017-10-26 03:36:12
【问题描述】:

https://codepen.io/quanahquan/pen/qmvYEq?editors=1010

var resultArray = [];

function pickRandom(){
  var min = parseInt(document.getElementById("min").value);
  var max = parseInt(document.getElementById("max").value);
    var result = Math.floor((Math.random() * max) + min);
     if (resultArray.includes(result))
      {
        pickRandom();
      }
     if (resultArray.length === max)
      {
        alert("you ran out of number");
      }
     else
      {
        resultArray.push(result);
        document.getElementById("result").value = result;
      }
  }

大家好...我无法理解这背后的逻辑

我有 2 个 IF 语句,但在这种情况下,如果我将 resultArray.length === max IF 语句放在第二个,它会导致不希望的结果,例如在所有 48 个数字被随机选择之前触发

如果我把 resultArray.length === max IF 语句放在第一位,那么它会在警报之前选择所有 48 个数字...

【问题讨论】:

  • 把所有代码都放在问题里,不应该是else if而不是else吗?
  • 我刚做了,谢谢,但如果是这样,那又如何呢?

标签: javascript arrays loops random


【解决方案1】:

您有两个输入 minma​​x。您还可以创建一个数组列表 - resultArray。每次当您选择一个幸运号码时,它都会检查该号码是否在该列表中。一开始它根本不进入第一个if,因为它是空的或者得到相同数字的机会非常低。实际上,您不需要第一个 if 语句,因为它会执行您的 onclick 事件调用。

第二个if 语句检查长度是否等于最大值。如果是这样,那么您就不能选择更多的幸运数字并每次都得到警报。

【讨论】:

    【解决方案2】:

    在我看来,这种算法效率不高。对于大量数字,它将花费大量时间来查找缺失的间隙。想象一下max 是 1,000,000,到目前为止,算法生成了 999,999 个数字。它会不断产生随机数,直到它管理人员找到丢失的数字,这将花费大量时间。

    我更新了您的代码以使其使用递归调用工作。它是为了学习,而不是在实际应用中使用。

    var resultArray = [];
    
    function pickRandom() {
        // Warning: min and max should't change between calls
        var min = parseInt(document.getElementById("min").value);
        var max = parseInt(document.getElementById("max").value);
    
        // result is in the interval [min, max]
        var result = Math.round((Math.random() * (max - min)) + min);
    
        // Do we have too many items in resultArray?
        if (resultArray.length === max - min + 1)
        {
            alert("you ran out of number");
        }
        else if (resultArray.includes(result))
        {
            // Already chosen, pick another number
            // Warning: going recursive is not efficient
            pickRandom();
        } else {
            // Is a new number. Store it and show it.
            resultArray.push(result);
            document.getElementById("result").value = result;
        }
      }
    

    您在代码中遇到的一些错误:

    • 计算结果错误,正确的方法是Math.round((Math.random() * (max - min)) + min)
    • 检测何时使用所有值的正确测试:(resultArray.length === max - min + 1),在您的代码中您忘记减去 min
    • 在您的代码中,第二个if 执行,无论第一个发生什么。因此,即使它已经在该数组中找到,它也会向 resultArray 添加一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-16
      • 2023-03-25
      • 2011-04-22
      • 2020-12-10
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多