JavaScript - Генерация делений пополам
У меня есть следующий код 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. Зачем?
3 ответа
Похоже, простое недоразумение &&
против ||
на этой линии:
while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0);
Цикл будет продолжаться только в том случае, если оба оператора будут иметь значение true. Давайте возьмем ваш 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
Кроме того, вы используете условие &&, которое в случае сбоя одного условия приведет к тому, что все утверждения будут ложными.
вам нужно, чтобы оба ваших утверждения были ложными. поэтому опция заключается в использовании оператора ИЛИ, который ИЛИ принимает ложь только тогда, когда оба условия ложны.
Ваше решение может быть:
while (8 < 7 || ((8 / 7) % 0.5) != 0)
мои заметки для вас, есть немного немного другая логика, когда вы избегаете определенного условия или ищете определенное условие.