Javascript逻辑运算符 - 和vs.

时间:2016-12-16 01:37:02

标签: javascript boolean logic operators logical-operators

我对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);

问题在于'而#39;条件: while((diceOne!== diceTwo)||(diceTwo!== diceThree))

使用' ||'操作员,程序按预期运行,并突破' while'循环时diceOne = diceTwo = diceThree即你掷三重奏。然而,这对我来说没有意义......使用' ||'操作员看起来'而#39;循环结束,条件评估为假,只有两个模具相等...

e.g。它会返回如下结果:

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 :(得分: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);

答案 1 :(得分:0)

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

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

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