Привет обитателям форума
учебная задача с которой я сегодня столкнулся звучит так:
Цитата:
|
"Сделайте функцию, каждый вызов который будет генерировать случайные числа от 1 до 100, но так, чтобы они не повторялись, пока не будут перебраны все числа из этого промежутка. Решите задачу через замыкания - в замыкании должен хранится массив чисел, которые уже были сгенерированы функцией."
|
В процессе решения данной задачи получилось следующее:
function makeRand() {
var usedNumbers = [];
function f() {
outer:
while(true) {
var num = Math.floor(Math.random() * 100) + 1;
for (var i = 0; i < usedNumbers.length; i++) {
if (usedNumbers[i] === num) break outer;
} break;
}
usedNumbers.push(num);
return num;
}
return f;
}
var func = makeRand();
func();
но данный код почему-то не работает, в массив попадают уже использованные числа, после еще часа мучений было придумано решение с рекурсией которое работает, но кажется выглядит как дикий костыль.
function makeRand() {
var usedNumbers = [];
function f() {
if (usedNumbers.length === 100) {
return;
}
var num = Math.floor(Math.random() * 100) + 1;
for (var i = 0; i < usedNumbers.length; i++) {
if (num === usedNumbers[i]) return f();
}
usedNumbers.push(num);
return num;
}
return f;
}
var func = makeRand();
//ниже вызов много раз
func();
Собственно вопросы:
1. Почему код с конструкцией while(true) break output не работает правильно
2. Какое оптимальное решение вы видите в данной задаче?