Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.05.2016, 11:32
Новичок на форуме
Отправить личное сообщение для daniil_angel Посмотреть профиль Найти все сообщения от daniil_angel
 
Регистрация: 03.05.2016
Сообщений: 1

Как "просканировать" массив
var arr = new Array();
for(var i=0; i<9; i++) {
   do{arr[i] = Math.floor(Math.random()*10);}while(arr[i]==0);
   document.write(arr[i] + " ");
}

Эта штука выводит случайные 9 цифр, не включая ноль.
Вопрос: как сделать так, чтобы цифры в массиве не повторялись, т.е. чтоб каждая цифра была уникальна?
Ответить с цитированием
  #2 (permalink)  
Старый 03.05.2016, 11:47
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от daniil_angel
как сделать так, чтобы цифры в массиве не повторялись, т.е. чтоб каждая цифра была уникальна?
Создать массив уникальных значений, random формирует индекс этого массива.

После 9 проходов ведь все равно будет повторение. Чтобы не проверять ранее сформированного значения, можно перемешивать массив, затем извлекать из него последний элемент, возвращая его, таки образом он уже не будет повторен гарантировано:

<script>
var a = [1,2,3,4,5,6,7,8,9];

Array.prototype.shuffle = function() {
    for (var i = this.length - 1; i > 0; i--) {
        var num = Math.floor(Math.random() * (i + 1)), 
            d = this[num];
        this[num] = this[i];
        this[i] = d;
    }
    return this;
}

function rnd() {
    if(a.length) {
        a.shuffle();
        return a.pop()
    } else return 0;
}
</script>
<button onclick="alert(rnd())">GO</button>

Последний раз редактировалось laimas, 03.05.2016 в 12:13.
Ответить с цитированием
  #3 (permalink)  
Старый 03.05.2016, 14:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

laimas,
зачем перемешивать постоянно хватило бы 1 раза ... но можно и не перемешивать совсем для данного случая.
<script>
var a = [1,2,3,4,5,6,7,8,9];
function rnd() {
    var c = a.length;
         return c && a.splice(Math.random()*c|0,1)[0] 
}
</script>
<button onclick="alert(rnd())">GO</button>

Последний раз редактировалось рони, 03.05.2016 в 14:35.
Ответить с цитированием
  #4 (permalink)  
Старый 03.05.2016, 15:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

рони,
так я и не планировал перетрахивать его постоянно, хотел добавить для случая когда !a.length (если только и впрямь не разово), но когда хост форума начинает долго ковырять, и желание пропадет в правках.

А вот об итерации массива сразу не подумал, надо запомнить.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно прописать массив? dee3000 Серверные языки и технологии 11 09.07.2015 06:22
Как добавить данные в глобальный массив из функции Jigan2 jQuery 2 14.03.2015 18:06
XMLHttpRequest как с php передать массив на яваскрипт? wadim Общие вопросы Javascript 3 16.03.2014 14:05
Как удалить массив? SunYang Общие вопросы Javascript 14 05.02.2010 14:31
Как лучше сделать глобальный массив skyfish AJAX и COMET 4 17.02.2009 18:05