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)

мои заметки для вас, есть немного немного другая логика, когда вы избегаете определенного условия или ищете определенное условие.

Другие вопросы по тегам