Проверка переменной случайного числа на соответствие значениям массива Javascript, не работает

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

var count = 10;

какие числа не генерировать (через запятую)

var doNotInclude = (document.getElementById("doNotIncludeInput").value).split(",");

и какое максимально возможное число должно быть

var highestNumber = 10;

Теоретически, если пользователь ввел «1,2» для переменной doNotInclude, функция должна создать массив, содержащий эти два числа, а затем каждый раз, когда она генерирует случайное число, сверять его с массивом, чтобы увидеть, является ли сгенерированное число правильным. одно из чисел, которое он не должен генерировать.

К сожалению, это не работает. Он создает массив так, как должен, который я проверил с помощью console.log(), но он все равно будет генерировать числа, которые не должен. Вот полный скрипт:

document.getElementById("button").onclick = function() {
var total = 0,
    average = 0,
    random = 0,
    count = parseInt(document.getElementById("countInput").value),
    doNotInclude = document.getElementById("doNotIncludeInput").value).split(","),
    highestNumber = parseInt(document.getElementById("highestNumberInput").value);
    document.getElementById("text1").innerHTML = "";

    for (var i = 0; i < count; i++) {
        var proceed = false;
        for (random = Math.floor(((Math.random()) * (highestNumber + 1))); proceed == false;) {
            if (doNotInclude.indexOf(random)===-1) {
                proceed = true;
            }   
        }
        document.getElementById("text1").innerHTML = document.getElementById("text1").innerHTML + "<br />" + (i + 1) + ". " + random;
        total = total + random;
        if (i == (count - 1)) {
            total / count;
            document.getElementById("text").innerHTML = "Mean average = " + (Math.round(total / count));
        }
    }
}

Часть, которая не работает

if (doNotInclude.indexOf(random)===-1) {
                proceed = true;
            }

функция indexOf - это то, о чем я читал здесь, но, думаю, я не совсем понимаю ее. Насколько я понимаю, он должен проверить, совпадают ли какие-либо значения массива со случайной величиной, и если нет, то вернуть «-1» и выполнить мой код. Хотя, похоже, этого не происходит. Я очень смущен ... хотел бы помочь. Возможно ли, что массив хранит числа в виде строк, а не целых чисел, и в этом проблема?


person Eric David Sartor    schedule 20.04.2015    source источник
comment
proceed используется для цикла, который продолжает генерировать случайные числа до тех пор, пока не получит число, не совпадающее с числом из массива. Цикл for будет продолжаться до тех пор, пока proceed == false. Если цикл обнаружит, что сгенерированное число не соответствует ничему в массиве, он установит proceed = true.   -  person Eric David Sartor    schedule 20.04.2015


Ответы (2)


Ваш оператор if не работает из-за принуждения.

===-1

Массив doNotInclude содержит строки, но random является целочисленным значением, === всегда сравнивает значение и тип обоих.

Вы должны либо использовать ==. Или иметь оба типа одинаковыми.

person wonderbell    schedule 20.04.2015
comment
Я просто не нашел способ преобразовать мой массив в целые числа, но теперь кажется, что цикл становится бесконечным, когда я его запускаю. Я не имею понятия почему... - person Eric David Sartor; 20.04.2015
comment
Ваш вопрос был о том, что какая-то часть не работает. Почему он входит в бесконечный цикл, это совсем другой вопрос. Я думаю, вам нужно отлаживать свой код. - person wonderbell; 20.04.2015
comment
@EricDavidSartor - это ответ. Причина, по которой вы получаете бесконечный цикл, указана в stackoverflow.com/a/2270344/862479. - person Denis Ali; 20.04.2015

Попробуйте эту скрипту

HTML

Count: <input id="countInput" value="10" /><br />
Do not include: <input id="doNotIncludeInput" value="0,1,2,3,4,5" /><br />
Highest Number: <input id="highestNumberInput" value="10" /><br />
<br />
<button type="button" id="button">Click to Run!</button><br />
<br />
Results:<br />
<div id="text1"></div>

Js

document.getElementById("button").onclick = function() {
    var currentCount = 0;
    var randomNumbers = [];
    var count = parseInt(document.getElementById("countInput").value);
    var doNotIncludeInput = document.getElementById("doNotIncludeInput").value.split(",");
    var highestNumberInput = parseInt(document.getElementById("highestNumberInput").value);
    var resultsElement = document.getElementById("text1");

    resultsElement.innerHTML = "";

    while(currentCount < count) {
        var random = -1;

        while(random === -1){
            random = Math.floor((Math.random()) * (highestNumberInput + 1));

            for(var i in doNotIncludeInput) {
                if(parseInt(doNotIncludeInput[i]) === random){
                    random = -1;
                }
            }

            if(random !== -1){
                randomNumbers.push(random);
            }
        }

        currentCount += 1;
    }

    resultsElement.innerHTML = randomNumbers.join(', ');
}
person dcabines    schedule 20.04.2015