2017-02-20 26 views
4

Ниже вы можете найти код для создания случайных 8 чисел между 1 и 80. Он помещает случайные числа в массив чисел и записывает их в div. Код работает без каких-либо проблем, если он увеличивает x внутри, если скобки. Если я поставил «x ++» за пределы скобок, после нескольких прогонов я обнаружил, что иногда он создает одно и то же случайное число и находит внутри массива чисел. Затем он пропускает и этот div пуст.Javascript if statement in while loop

В чем разница между приращением x в if block и приращением x снаружи, если блок?

Внутри если блок:

var numbers = [] 
var luckyNumber; 
var x = 1; 

while (x <= 8) { 
    luckyNumber = Math.floor(Math.random() * 80 + 1); 
    if (numbers.indexOf(luckyNumber) == -1) { 
    document.getElementById('k' + x).innerHTML = luckyNumber; 
    numbers.push(luckyNumber); 
    x++; 
    } 
} 

Вне если блок:

var numbers = [] 
var luckyNumber; 
var x = 1; 

while (x <= 8) { 
    luckyNumber = Math.floor(Math.random() * 80 + 1); 
    if (numbers.indexOf(luckyNumber) == -1) { 
    document.getElementById('k' + x).innerHTML = luckyNumber; 
    numbers.push(luckyNumber); 
    } 
    x++; 
} 

HTML:

<div id="k1">K1</div> 
<div id="k2">K2</div> 
<div id="k3">K3</div> 
<div id="k4">K4</div> 
<div id="k5">K5</div> 
<div id="k6">K6</div> 
<div id="k7">K7</div> 
<div id="k8">K8</div> 

ответ

4

Когда вы кладете приращение вне если условия, если существует такое число уже присутствует в numbers массиве, то он не будет входить во если условие и, следовательно, ДИВ никогда не заполняется. Однако вы переходите к следующему div, так как вы увеличиваете значение x. Если вы добавили инкремент x снаружи, значения x останутся неизменными, если условие внутри if не выполнено, поэтому на следующей итерации условие может пройти или продолжить попытки.

Выполнение потока

Когда вы увеличиваете внутрь, если

1) Generate random number. 
2) Check in is already generated, if yes skip it. // you see ? when skip no increment happens, because the increment inside the the condition. 
3) Generate again and go to step 2. 

Когда вы увеличиваете снаружи, если

1) Generate random number. 
2) Check in is already generated, if yes skip it. Increase x value to next. //** you see ? incrementing no matter you skip it or not. 
3) Generate again and go to step 2. 
+0

Продолжает ли он создать случайное число и проверить, если он уже в цифрах массива? Я думал, что если оператор выполняется один раз для каждой итерации цикла while. Поэтому он не будет увеличиваться до тех пор, пока условие не будет истинным и продолжит попытки. Правильно ? –

+0

@ user7580495 Да. В противном случае, если он генерируется и найден в массиве, вам нужно снова создать и проверить. Не так ли? Это происходит прямо сейчас. –

1
  • Потому что в первом примере вы заранее x только в случай, если уникальное случайное число ha сгенерировано.
  • Во втором примере вы продвигаете x независимо от того, был ли сгенерированный номер уникальным или нет. Так может случиться в этом случае, что из 8 раз он пытался (потому что это ваше условие while), он генерировал, например, только два уникальных случайных числа.
0

если вы пишете х ++ снаружи, если она всегда увеличивается на 1 ом если вы положите внутрь, если его ясно, что он увеличивается, когда ваше состояние удовлетворено .. в соответствии с этим вы можете отличаться.

0

приращение на улице, если блок будет выполнен без каких-либо условий.

Но вы инкрементируете внутри, , если блок будет выполняться только при этом условии.

0

Вы можете использовать цикл do while для проверки, если номер уже занят.

var numbers = [], 
 
    luckyNumber, 
 
    x = 1; 
 

 
while (x <= 8) { 
 
    do { 
 
     luckyNumber = Math.floor(Math.random() * 80 + 1); 
 
    } while (numbers.indexOf(luckyNumber) !== -1) 
 
    document.getElementById('k' + x).innerHTML = luckyNumber; 
 
    numbers.push(luckyNumber); 
 
    x++; 
 
}
<div id="k1">K1</div> 
 
<div id="k2">K2</div> 
 
<div id="k3">K3</div> 
 
<div id="k4">K4</div> 
 
<div id="k5">K5</div> 
 
<div id="k6">K6</div> 
 
<div id="k7">K7</div> 
 
<div id="k8">K8</div>