Иногда ничто не вычисляет true в операторах If

#javascript

#javascript

Вопрос:

У меня есть эти операторы If, основанные на функции Math.random(), и она работает по большей части, но иногда ничто не вычисляется как true

Я попытался изменить числа, которые сравнивают логические операторы, и я попытался изменить число, на которое умножается Math.random

 var dodge = {
    dodgeValue: function() {
      return Math.floor(Math.random() * 10)   1
    },
    roll: function() {
      console.log('ROLL AFTER DODGE?'); //DELETE THIS
      if (this.dodgeValue() <= 5) {
        console.log('Ball Rolls to Person One');
        dodgeBall.ball.position = 'on ground';
        dodgeBall.personOne.ball();

      }
      if (this.dodgeValue() >= 5) {
        console.log('Ball Rolls to Person Two');
        dodgeBall.ball.position = 'on ground';
        dodgeBall.personTwo.ball();

      }
    },
  

Это одна из двух частей, которые имеют одну и ту же проблему, другая при копировании и вставке была действительно перепутана, поэтому я ее не учел, но если у кого-нибудь есть какие-либо идеи о том, почему это происходит или как это исправить, это было бы здорово.

Комментарии:

1. Когда ваш первый случайный > 5 и ваш второй < 5 , да. Ничего не будет выполняться.

Ответ №1:

Вы генерируете два случайных числа. Новый каждый раз, когда вы пишете this.dodgeValue() .

Кроме того, если значение равно точному 5 , то будут запущены обе ветви — вероятно, это не предполагаемое поведение.

Вы должны сделать что-то вроде let dodge = this.dodgeValue(); , а затем использовать if( dodge <= 5) . Кроме того, вы должны использовать else вместо «если тогда … если не A, то … «

Ответ №2:

Это потому, что вы дважды вызываете dodgeValue , который дважды вызывает random .

На секунду игнорируя тот факт, что случайные числа в компьютерах на самом деле псевдослучайны, давайте посмотрим, что происходит, когда вы дважды вызываете dodgeValue, чтобы получить два случайных числа, как у вас.

Вы могли бы предположительно получить следующие числа из этого кода:

  • 4
  • 6 8
  • 6 2

В первом случае первый if будет иметь значение true и выполняться, поскольку 4 <= 5 .

Первое if будет false , но второе if будет true , поскольку 6 > 5 (first if is false) и 8 >= 5 (second if is true) .

Теперь, что происходит в этом третьем случае? Оба if будут false , поскольку 6 > 5 (first if is false) и 2 < 5 (second if is false) .

Если вы хотите, чтобы это работало именно так (что я предполагаю, что нет), оставьте свой код как есть. Если нет, у вас есть 2 варианта в зависимости от ваших потребностей.

Если вам нужно сохранить выходные данные dodgeValue на потом, вы можете использовать переменную:

 var dodge = {
    dodgeValue: function() {
      return Math.floor(Math.random() * 10)   1
    },
    roll: function() {
      console.log('ROLL AFTER DODGE?'); //DELETE THIS
      var val = this.dodgeValue();
      if (val <= 5) {
        console.log('Ball Rolls to Person One');
        dodgeBall.ball.position = 'on ground';
        dodgeBall.personOne.ball();

      }
      if (val >= 5) {
        console.log('Ball Rolls to Person Two');
        dodgeBall.ball.position = 'on ground';
        dodgeBall.personTwo.ball();

      }
    },
  

Если вам просто нужно, чтобы они были противоположны друг другу, тогда просто используйте вместо этого предложение else .

 var dodge = {
    dodgeValue: function() {
      return Math.floor(Math.random() * 10)   1
    },
    roll: function() {
      console.log('ROLL AFTER DODGE?'); //DELETE THIS
      if (this.dodgeValue() <= 5) {
        console.log('Ball Rolls to Person One');
        dodgeBall.ball.position = 'on ground';
        dodgeBall.personOne.ball();

      } else {
        console.log('Ball Rolls to Person Two');
        dodgeBall.ball.position = 'on ground';
        dodgeBall.personTwo.ball();

      }
    },