Поэтому я пытаюсь создать три значения от 1 до 3, которые будут отличаться при каждой загрузке страницы. Он отлично работает, когда я открываю страницу в первый раз, но всякий раз, когда я пытаюсь перезагрузить или отправить свою форму, страница останавливается, и она застревает при загрузке. Любая помощь высоко ценится!

function uniqueAnswerId(){
    var rand = (Math.random() * 3.4);
    while (Math.round(rand) == 0) {
        var rand = (Math.random() * 3.4);
    }
    return (Math.round(rand));
}
var answerId1 = uniqueAnswerId();

function uniqueAnswerId2(){
    var rand2 = (Math.random() * 3.4);
    while (answerId1 == Math.round(rand2) || Math.round(rand2) == 0) {
        var rand2 = (Math.random() * 3.4);
    }
    return (Math.round(rand2));
}

var answerId2 = uniqueAnswerId2();

function uniqueAnswerId3(){
    var rand3 = (Math.random() * 3.4);
    while (answerId1 == Math.round(rand3) || answerId2 == Math.round(rand3)){
        while (Math.round(rand3) == 0){
            var rand3 = (Math.random() * 3.4);
        }
    }
    return (Math.round(rand3));
}

var answerId3 = uniqueAnswerId3();

console.log("AnswerIds: " + (answerId1) + ", " + (answerId2) + ", " + (answerId3))
0
Christopher Krohn 17 Дек 2015 в 18:05

3 ответа

Лучший ответ

Ваш 3-й цикл while должен выглядеть следующим образом: «||» в вашем состоянии вместо совершенно нового цикла while.

function uniqueAnswerId3(answerId1, answerId2){
    var rand3 = (Math.random() * 3.4);
    while (answerId1 === Math.round(rand3) || answerId2 === Math.round(rand3) || Math.round(rand3)===0){
             rand3 = (Math.random() * 3.4);
    }
    return (Math.round(rand3));
}
1
Mihriban Minaz 17 Дек 2015 в 15:46

Взгляните на эту часть вашего кода:

while (answerId1 === Math.round(rand3) || answerId2 === Math.round(rand3)){
        while (Math.round(rand3) === 0){
             rand3 = (Math.random() * 3.4);
        }
    }

Посмотрим, что произойдет со следующими значениями:

  • answerId1 = 1
  • answerId1 = 2
  • Math.round (rand3) = 1

В этом случае у вас будет:

while (true){
    while(false){
        never_executed();
    }
}

Таким образом, он будет повторяться до бесконечности во внешнем «время».

Чтобы избежать этого, вы можете просто сделать то, что говорит @Nakolas Bakolias, добавить еще один «||» в вашем состоянии вместо совершенно нового цикла

0
jolmos 17 Дек 2015 в 15:34

Я считаю, что у вас есть бесконечный цикл. Вот скрипка для исправления вашего кода.

Изменения: используйте «===» вместо «==»

Функция Hoisting выполняет эти функции до объявления переменных, что означает, что ссылка на них внутри функций не работает. Добавлены параметры для принятия необходимых аргументов.

https://jsfiddle.net/80xdmsjL/

function uniqueAnswerId(){
    var rand = (Math.random() * 3.4);
    while (Math.round(rand) === 0) {
        rand = (Math.random() * 3.4);
    }
    return (Math.round(rand));
}

var answerId1 = uniqueAnswerId();

function uniqueAnswerId2(answerId1){
    var rand2 = (Math.random() * 3.4);
    while (answerId1 === Math.round(rand2) || Math.round(rand2) === 0) {
         rand2 = (Math.random() * 3.4);
    }
    return (Math.round(rand2));
}

var answerId2 = uniqueAnswerId2(answerId1);

function uniqueAnswerId3(answerId1, answerId2){
    var rand3 = (Math.random() * 3.4);
    while (answerId1 === Math.round(rand3) || answerId2 === Math.round(rand3)){
        while (Math.round(rand3) === 0){
             rand3 = (Math.random() * 3.4);
        }
    }
    return (Math.round(rand3));
}

var answerId3 = uniqueAnswerId3(answerId1, answerId2);

console.log("AnswerIds: " + (answerId1) + ", " + (answerId2) + ", " + (answerId3))
0
Andrue Anderson 17 Дек 2015 в 15:14