【问题标题】:Math.random Keeps Returning the Same AnswerMath.random 不断返回相同的答案
【发布时间】:2015-05-18 01:43:46
【问题描述】:

我对编码和 javascript 还是很陌生,但我将下面的代码编写为三路随机化器。一切似乎都运行良好,除了无论我运行代码多少次,返回都是以“c”形式插入的任何内容。我想知道是否有人可以给我一些关于如何解决这个问题的快速建议。谢谢。

var random = function() {
  var randomizer = function() {
    Math.random() * 100
  }

  if (randomizer <= 33) {
    var compDecision = "a"
  }
  else if (randomizer > 67) {
    var compDecision = "b"
  }
  else if (33 < randomizer <= 67) {
    var compDecision = "c"
  }

  document.write(compDecision)
}

【问题讨论】:

标签: javascript


【解决方案1】:

在您的代码中,“randomizer”是一个函数。要执行它并获取它返回的值,您必须在它后面加上一对括号:randomizer()

所以randomizer &lt;= 33 不是比较两个数字,而是比较一个函数和一个数字。 randomizer &gt; 67 也是如此。因此,它们每个都评估为false

然后,33 &lt; randomizer &lt;= 67 的计算结果为 true。为什么?我不知道。但因为它被认为是“真实的”,var compDecision = "c" 被执行。

这就是为什么你不断得到“c”。

编辑: RobG 下面的评论解释了为什么 33 &lt; randomizer &lt;= 67 在 JavaScript 中的计算结果为 true

【讨论】:

  • 为什么?我不确定”。运算符具有相同的优先级,因此从左到右进行评估。 &lt;&lt;= 将它们的操作数强制为 Number。在33 &lt; randomizer 中,randomizer 被强制转换为 Number 并计算为 NaN,因此表达式解析为 false。表达式现在是false &lt;= 67,所以 false 被强制转换为 Number 并计算为 0,小于 67,因此整个表达式计算为 true.
【解决方案2】:

您可以将代码简化为:

var randomizer = Math.random() * 100;

if (randomizer <= 33) {
  var compDecision = "a";
} else if (randomizer > 67) {
  var compDecision = "b";
} else if (33 < randomizer && randomizer <= 67) {
  var compDecision = "c";
}

alert(compDecision);

【讨论】:

  • 是的,你是对的,jquery 不是必需的。我以不同的方式开始并忘记删除它。
  • 它可以比这简单得多,最后一个比较不是必需的,因为如果它不是前两个之一,它必须是最后一个。 ;-)
【解决方案3】:

关键字var 用于创建/声明/初始化变量。每个变量只执行一次。

在包含它的函数顶部声明一个变量也是一个好习惯。

function() {
  var result;

  if (condition1 === true) {
    result = "a";
  } else if (condition2 === true) {
    result = "b"
  } else {
    result = "c"
  }

  return result;
}

【讨论】:

    【解决方案4】:

    JavaScript 要求在每条语句后使用分号。但是,if/then/else 后面不应跟分号。

    if (a < 10) {
      alert("Less than ten.");
    } else {
      alert("Ten or more.");
    }
    

    有时分号会自动插入它们所属的位置,但您不应该依赖这一点 - 最好自己输入。

    【讨论】:

    • 您绝对应该使用JSLint 或类似的工具来检查您的代码是否缺少分号、未闭合的括号和许多其他问题。有时,最重要的是小事!
    • 这根本不是真的。 JS 中的分号仅在某些地方需要。 stackoverflow.com/a/4002248
    • 这取决于您所说的“必需”是什么意思。我想从技术上讲,分号需要(1)手动输入或(2)自动插入(ASI)。
    【解决方案5】:

    我认为,你可以这样做:

    function Randomize(){
        rng = Math.random() * 3;
        rng = Math.round(rng);
        switch(rng) {
        case 0:
            return "a"
            break;
        case 3:
            return "a"
            break;
        case 1:
            return "b"
            break;
        case 2:
            return "c"
            break;
        };
    };
    alert(Randomize());
    

    【讨论】:

      【解决方案6】:

      您没有正确调用randomizer 函数。我已将其删除,因为在这种情况下它并不是真正需要的:

      var random = function() {
          // I assume you want the comparisons below to be run against the same number
          var randomNumber = Math.random() * 100;
      
          if (randomNumber <= 33) {
              var compDecision = "a";
          }
          else if (randomNumber > 67) {
              var compDecision = "b"
          }
          else {
              var compDecision = "c"
          }
      
          return compDecision;
      }
      

      【讨论】:

        【解决方案7】:

        丹涛的回答很好,另外似乎没有任何意义指向只调用一次的单行函数,所以:

        var n = Math.random() * 100;
        

        但是,document.write 部分可能应该是分开的,因为您可能希望以不适合始终将结果写入当前文档的方式调用此函数。

        最后,您只需要测试三个条件中的两个,因为如果不是前两个条件之一,则必须是第三个。您为此使用条件运算符:

        function random() {
          var n = Math.random() * 100;
          return n <= 33? 'a' : n <= 67? 'c' : 'b';
        }
        
        document.write(random()); 
        

        【讨论】:

          【解决方案8】:

          马上就会想到一堆东西:

          1。 JavaScript 没有隐式返回

          所以这和你想的不一样:

          var randomizer = function() {
            Math.random() * 100
          }
          

          该函数返回undefined。你需要:

          var randomizer = function() {
            return Math.random() * 100
          }
          

          2。括号在 JavaScript 函数调用中不是可选的

          所以这个不符合你的想法:

          if (randomizer <= 33) {
              var compDecision = "a"
          }
          

          你需要:

          if (randomizer() <= 33) {
              var compDecision = "a"
          }
          

          3。 JavaScript 没有三向比较

          所以这和你想的不一样:

          else if (33 < randomizer <= 67)
          

          你需要:

          else if (33 < randomizer() && randomizer() <= 67)
          

          最后,正如其他人所提到的,将randomizer 定义为函数 实际上首先没有意义。为了让您的 random 函数做您想做的事情(以大致相等的概率生成 'a''b''c'),您真的想在函数的开头生成一个随机值并重用它:

          function random() {
            var randomizer = Math.random() * 100;
          
            if (randomizer <= 33) {
              return 'a';
            } else if (randomizer <= 67) {
              return 'b';
            } else {
              return 'c';
            }
          }
          
          console.log(random());
          

          希望对您有所帮助。

          【讨论】:

          • 确保不要多次调用随机函数!那会破坏条件逻辑
          • 为什么还要使用100?为什么不3,因为它正好是三个选项?使用 33 和 67 使b 的可能性更大。
          【解决方案9】:

          randomizer 是一个持有函数的变量。

          要理解这个问题,请尝试

          alert(Math.random());

          var value = randomizer(); 警报(值);

          【讨论】:

          • 这是很重要的一点。在 JavaScript 中,变量可以保存任何对象,而 JavaScript 中的函数是对象。并非每种语言都如此,因此有时会让人绊倒。
          • 只是一个更正——当你在函数名后面加上括号 () 时,它“调用”函数,然后返回一个值。例如,语句var x = Math.random() 将一个数字分配给x,var x = Math.random 将一个函数分配给x。在JS Bin 上亲自尝试一下,感受一下它的工作原理。
          猜你喜欢
          • 2015-06-30
          • 1970-01-01
          • 1970-01-01
          • 2015-02-22
          • 1970-01-01
          • 2022-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多