Показать сообщение отдельно
  #1 (permalink)  
Старый 17.10.2018, 16:46
Новичок на форуме
Отправить личное сообщение для ytil Посмотреть профиль Найти все сообщения от ytil
 
Регистрация: 15.10.2018
Сообщений: 8

Генерация случайных числ без повторений
Привет обитателям форума

учебная задача с которой я сегодня столкнулся звучит так:

Цитата:
"Сделайте функцию, каждый вызов который будет генерировать случайные числа от 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. Какое оптимальное решение вы видите в данной задаче?
Ответить с цитированием