JavaScript - 产生两半的分裂
JavaScript - Generating divisions in halves
我有以下 JavaScript 代码:
var expressionBuilder = function() {
var firstNumber = getRandomInt(1, 10);
var secondNumber = getRandomInt(1, 10);
var operand = getRandomOperator();
if (operand === '-') {
do {
firstNumber = getRandomInt(1, 10);
secondNumber = getRandomInt(1, 10);
} while (firstNumber < secondNumber);
}
if (operand === '/') {
do {
firstNumber = getRandomInt(1, 10);
secondNumber = getRandomInt(1, 10);
} while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0);
}
return firstNumber + ' ' + operand + ' ' + secondNumber;
};
这是不言自明的。除法位应该生成数字,这样我只会得到除法结果,如 0.5、1、1.5 等:
((firstNumber / secondNumber) % 0.5) != 0
能被1/2整除。然而,我仍然得到像 8/7 这样的表达。为什么?
这行看起来像是对 &&
和 ||
的简单误解:
while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0);
只有当两个语句的计算结果为真时,循环才会继续。让我们以您的 8/7
为例:
while (8 < 7 && ((8 / 7) % 0.5) != 0);
8 < 7
的计算结果为 false
。因此循环 不会 继续,并且这些数字已设置。
你很想||
;如果这些陈述中的任何一个为真,您希望它继续。两者都不是。
while (firstNumber < secondNumber || ((firstNumber / secondNumber) % 0.5) != 0);
您有:
firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0)
正如您所指出的,它允许通过 firstNumber == 8
和 secondNumber == 7
此组合未满足您 while
中的第一个条件,而第二个条件(%
)甚至从未计算过。
这就是&&
(and
)的本质。
看来我知道你在做什么,你想继续循环生成的数字,直到你可以避免 while 条件中所述的失败条件。
让我们评估语法问题:
while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0)
以8/7为例,即firstNumber = 8,secondNumber = 7
成为
while (8 < 7 && ((8 / 7) % 0.5) != 0)
do while 会一直循环直到条件为假,所以让我们一一检查。
8 < 7 will return false
此外,您正在使用 && 条件,如果一个条件失败,它将使整个语句为假。
你需要你的两个陈述都是假的。所以选择是使用 OR 运算符,只有当两个条件都为 false 时,OR 才取 false。
您的解决方案可能是:
while (8 < 7 || ((8 / 7) % 0.5) != 0)
我给你的笔记是,当你避免特定条件或搜索特定条件时,逻辑略有不同。
我有以下 JavaScript 代码:
var expressionBuilder = function() {
var firstNumber = getRandomInt(1, 10);
var secondNumber = getRandomInt(1, 10);
var operand = getRandomOperator();
if (operand === '-') {
do {
firstNumber = getRandomInt(1, 10);
secondNumber = getRandomInt(1, 10);
} while (firstNumber < secondNumber);
}
if (operand === '/') {
do {
firstNumber = getRandomInt(1, 10);
secondNumber = getRandomInt(1, 10);
} while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0);
}
return firstNumber + ' ' + operand + ' ' + secondNumber;
};
这是不言自明的。除法位应该生成数字,这样我只会得到除法结果,如 0.5、1、1.5 等:
((firstNumber / secondNumber) % 0.5) != 0
能被1/2整除。然而,我仍然得到像 8/7 这样的表达。为什么?
这行看起来像是对 &&
和 ||
的简单误解:
while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0);
只有当两个语句的计算结果为真时,循环才会继续。让我们以您的 8/7
为例:
while (8 < 7 && ((8 / 7) % 0.5) != 0);
8 < 7
的计算结果为 false
。因此循环 不会 继续,并且这些数字已设置。
你很想||
;如果这些陈述中的任何一个为真,您希望它继续。两者都不是。
while (firstNumber < secondNumber || ((firstNumber / secondNumber) % 0.5) != 0);
您有:
firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0)
正如您所指出的,它允许通过 firstNumber == 8
和 secondNumber == 7
此组合未满足您 while
中的第一个条件,而第二个条件(%
)甚至从未计算过。
这就是&&
(and
)的本质。
看来我知道你在做什么,你想继续循环生成的数字,直到你可以避免 while 条件中所述的失败条件。
让我们评估语法问题:
while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0)
以8/7为例,即firstNumber = 8,secondNumber = 7 成为
while (8 < 7 && ((8 / 7) % 0.5) != 0)
do while 会一直循环直到条件为假,所以让我们一一检查。
8 < 7 will return false
此外,您正在使用 && 条件,如果一个条件失败,它将使整个语句为假。
你需要你的两个陈述都是假的。所以选择是使用 OR 运算符,只有当两个条件都为 false 时,OR 才取 false。
您的解决方案可能是:
while (8 < 7 || ((8 / 7) % 0.5) != 0)
我给你的笔记是,当你避免特定条件或搜索特定条件时,逻辑略有不同。