2017-02-17 7 views
0

Я пытаюсь получить 8 случайных чисел между 1-80 и помещать их в указанные div.Javascript Генератор случайных чисел

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

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

 
document.write(numbers);
<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>

Последние 2 чисел показаны неопределенными в HTML результат. Но если вы проверите номера с помощью document.write, вы увидите последние два числа. Как я могу решить эту проблему?

+0

Данный код уже работает в скрипку. Я считаю, что некоторые изменения произошли. –

ответ

0
  • в то время как цикл проходит от 1 до 7, генерируя 7 чисел вместо 8.
  • Массивы в JavaScript являются 0-индексируются, поэтому, когда вы идете через массив в цикл for, начинающийся с 1, вы пропускаете первый номер.
  • Вы повторно заполняете divs каждый раз, когда вы создаете новый номер со старыми числами, исключая новый номер. Последнее сгенерированное число никогда не будет включено в этот процесс.

Самое простое исправление заключается в том, чтобы исправить цикл while, удалить цикл for и использовать x, чтобы найти div, где будет отображаться последний номер.

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++; 
 
    } 
 
} 
 

 
document.write(numbers);
<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>

+0

Последняя часть вашего ответа не ясна для меня. Не могли бы вы объяснить это еще раз? Почему мой цикл не может записываться в последние два div вместо первого и последнего. В нем отсутствует первое и последнее случайное число, но последние два div не определены. –

+0

Поскольку последний цикл цикла for работает, массив 'numbers' содержит только 6 элементов в индексах 0-5. Поэтому divs 6-8 заполнены «undefined», потому что в массиве нет ничего другого. – JJJ

+0

Я понял. Я поставил «numbers.push (luckyNumber)»; before for, изменил «числа [i]» на числа [i -1], и теперь он работает. Но я думаю, что запуск цикла for 8 раз не эффективный способ сделать это. Итак, какой из них является самым быстрым способом для вашего или xitter? –

1

Ваша логика цикла является неправильной. Сначала вы должны заполнить массив чисел, а затем обновить html.

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

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

 
document.write(numbers);
<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>

+1

Код должен содержать сопроводительный текст, поясняющий, в чем проблема: –

+0

Да, конечно, я пропустил, чтобы увидеть шаг x. Спасибо @JJJ. – Abhitalks

+0

Я предпочитаю подход с двумя проходами; Однако я бы просто использовал 'forEach' или использовал' numbers.length' во втором цикле вместо жесткого кодирования 9 дважды –