Проблема:
Когда вы узнаете, что номер уже существует, вы должны разорвать цикл и вернуть результат generateNumber
:
if (position[i] == number) {
return generateNumber();
}
Альтернативный способ:
В любом случае, функция generateNumber
могла бы быть реализована лучше, удалив рекурсивные вызовы и поместив все это в IIFE для инкапсуляции:
var generateNumber = (function() {
var numbers = [];
return function() {
var number;
do {
number = Math.floor(Math.random() * 16);
} while(numbers.includes(number));
numbers.push(number);
return number;
}
})();
Лучший способ:
Еще лучший способ - заполнить массив числами (от 0 до 15), перемешать их, а затем каждый раз, когда вызывается функция, вы простоpop
или shift
число из этого массива:
var generateNumber = (function() {
var numbers = [];
for(var i = 0; i < 16; i++) numbers.push(i);
for(var i = 0; i < 16; i++) {
var randIndex = Math.floor(Math.random() * 16);
var temp = numbers[i];
numbers[i] = numbers[randIndex];
numbers[randIndex] = temp;
}
return function() {
return numbers.pop();
}
})();