首页 文章

Javascript逻辑运算符 - 和vs.或

提问于
浏览
0

我对Javascript和编程相对较新 . 今天在写一个简单的三骰子滚动模拟器时,我遇到了一个问题,我解决了这个问题,但我仍然不明白 . 这是我的代码......

//                      ROLLING TRIPLES

var diceSides = 6;
var diceOne = Math.floor(Math.random() * diceSides + 1);
var diceTwo = Math.floor(Math.random() * diceSides + 1);
var diceThree = Math.floor(Math.random() * diceSides + 1);
var rolls = 3;

while ((diceOne !== diceTwo) || (diceTwo !== diceThree)) {
    console.log("Dice 1: " + diceOne);
    diceOne = Math.floor(Math.random() * diceSides + 1);
    console.log("Dice 2: " + diceTwo);
    diceTwo = Math.floor(Math.random() * diceSides + 1);
    console.log("Dice 3: " + diceThree);
    diceThree = Math.floor(Math.random() * diceSides + 1);
    console.log("Rolling again");
    rolls += 3;
}
console.log("Dice 1: " + diceOne);
console.log("Dice 2: " + diceTwo);
console.log("Dice 3: " + diceThree);
console.log("Rolled a triple!!!");

console.log(rolls);

问题是'while'条件:while((diceOne!== diceTwo)||(diceTwo!== diceThree))

使用'||'运算符,程序按预期运行,并在diceOne = diceTwo = diceThree时跳出'while'循环,即滚动三元组 . 这对我来说没有意义...使用'||'运算符似乎'while'循环将完成,条件已经评估为假,只有两个模具相等...

例如它会返回如下结果:

Dice 1: 4
Dice 2: 4
Dice 3: 6
Rolled a triple!!!

因为在这种情况下,diceOne等于diceTwo,即使diceTwo不等于diceThree . 在这种情况下,使用'||'运算符,我希望'while'循环停止,因为看起来条件已经满足......但它没有,它会返回:

Dice 1: 4
Dice 2: 4
Dice 3: 6
Rolling again

......我期望用'&&:运算符 . 除了'&&'运算符,代码返回我期望的'||'运营商:

Dice 1: 4
Dice 2: 4
Dice 3: 6
Rolled a triple!!!

代码完成,即使三元组尚未滚动 . 这就是我用“&&”运算符在我脑海中听起来的方式......

“如果diceOne和diceTwo和DiceThree相同,那么你已经完成了三倍 . ”

用'||'运营商...

“如果diceOne和diceTwo相等,或者diceTwo和diceThree是相等的,那么你已经翻了三倍 . ”

你显然没有,因为三个模具中只有两个是相同的 .

我知道我一直在继续...这对我来说很难解释 . 可能有一个非常简单的解释,但这真的让我烦恼!

在旁注:我可以使用任何快捷方式多次生成随机数而无需输入Math.floor(Math.random .....我无法将其分配给变量并输入变量,因为它生成一个随机数,并在每次遇到变量时使用该数字 . 有没有更有效的方法来做到这一点?

干杯

2 回答

  • 0

    您可以使用OR或AND,它们可以使用De Morgan's Laws从一个转换为另一个 .

    dice1 != dice2 || dice2 != dice3
    

    相当于:

    ! (dice1 == dice2 && dice2 == dice3)
    

    第一个表达式是“虽然前两个骰子不相等或者后两个骰子不相等”(即两个等式中的一个是假的) .

    第二个表达式表示“虽然NOT(前两个骰子相等而后两个骰子相等)”(即两个等式中的一个是假的) .

    使用truth table这种东西很有帮助,它可以帮助你可视化布尔组合 .

    至于你的旁注,随机数生成,你正在以正确的方式做 . 您需要每次都获得一个新号码,因此每次都必须再次拨打 Math.random() .

    您可以将其提取到一个函数中,以便在您想要使用它时更清晰:

    function generateRandom(diceSides) {
        return Math.floor(Math.random() * diceSides + 1);
    }
    

    然后像这样使用它:

    var diceOne = generateRandom(diceSides);
    
  • 0

    您对逻辑运算符的理解是正确的,您对 while 的工作原理感到困惑 . 当满足条件时它会保持循环,当条件失败时它会停止 .

    因此,当只有两个骰子相等时,其中一个 != 条件为真,所以 || 条件也为真,因此它继续循环 . 当所有三个骰子相等时,两个 != 条件将为 falsefalse || false 也为 false ,因此循环停止 .

    某些语言有 until 语句,类似于 while 但反转条件,以便在条件为真时循环停止 . 这将按照你描述的方式工作 .

相关问题