Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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. Какое оптимальное решение вы видите в данной задаче?
Ответить с цитированием
  #2 (permalink)  
Старый 17.10.2018, 17:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

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

Сообщение от рони Посмотреть сообщение
ytil,
создать массив и перемешать.
если без создания нового массива?
Ответить с цитированием
  #4 (permalink)  
Старый 17.10.2018, 17:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

Сообщение от ytil
если без создания нового массива?
не понимаю, а где хранить результат?
Ответить с цитированием
  #5 (permalink)  
Старый 17.10.2018, 17:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

Генерация случайных числ без повторений
ytil,
<script>
function makeRand(num) {
    var usedNumbers = [num--];
    !function f() {
        var i = Math.round(Math.random() * usedNumbers.length);
        usedNumbers.splice(i,0,num--);
        num && f()
    }();
    return usedNumbers;
}

var arr = makeRand(100);

document.write(arr)
  </script>

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

задача там не в том, чтобы хранить результат, а в том чтобы выводить числа которые были не использованы. Почему мой код с циклом не работает? можете взглянуть?
Ответить с цитированием
  #7 (permalink)  
Старый 17.10.2018, 18:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

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

Сообщение от рони Посмотреть сообщение
так создайте упорядоченый массив и доставайте из него хаотично
спасибо за советы
Ответить с цитированием
  #9 (permalink)  
Старый 17.10.2018, 18:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

Сообщение от ytil
чтобы выводить числа которые были не использованы
<script>
function makeRand(num) {
    var usedNumbers = {length : 0};
    function f() {
        if(usedNumbers.length == num) usedNumbers = {length : 0};
        var i = Math.floor(Math.random() * num);
        return i in usedNumbers ? f() : (usedNumbers.length++, usedNumbers[i]=true, ++i)

    }
    return f;
}

var x = makeRand(100);

document.write(x()+"<br>");
document.write(x()+"<br>");
document.write(x()+"<br>");
  </script>
Ответить с цитированием
  #10 (permalink)  
Старый 17.10.2018, 18:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

ytil,
для новых браузеров
<script>
function makeRand(num) {
    var usedNumbers = [];
    function f() {
        if(usedNumbers.length == num) usedNumbers = [];
        var i = Math.floor(Math.random() * num) + 1;
        return usedNumbers.includes(i) ? f() : (usedNumbers.push(i),i)

    }
    return f;
}

var x = makeRand(100);

document.write(x()+"<br>");
document.write(x()+"<br>");
document.write(x()+"<br>");
  </script>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор случайных чисел без повторений в последующих генерациях Samik Общие вопросы Javascript 14 12.03.2023 00:35
Нужен генератор случайных чисел без Math.random Kirill_98 Учебные материалы 39 16.02.2018 22:20
Генерация случайных уникальных чисел karakym Общие вопросы Javascript 0 02.10.2015 14:29
Случайное значение без повторений в диапазоне от min до max ponyspy Общие вопросы Javascript 16 26.03.2014 20:17