If语句的顺序

时间:2017-05-25 13:02:30

标签: javascript arrays loops random

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个数字......

2 个答案:

答案 0 :(得分:1)

在我看来,这种算法效率不高。对于大数字,它将花费大量时间来找到缺失的空白。想象一下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
  • 在您的代码中,无论第一个{1}}发生什么,第二个if都会执行。因此,即使已在该数组中找到它,它也会向resultArray添加一个值。

答案 1 :(得分:0)

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

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