Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как "просканировать" массив (https://javascript.ru/forum/misc/62825-kak-proskanirovat-massiv.html)

daniil_angel 03.05.2016 11:32

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

laimas 03.05.2016 11:47

Цитата:

Сообщение от 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>

рони 03.05.2016 14:33

laimas,
:write: зачем перемешивать постоянно хватило бы 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>

laimas 03.05.2016 15:35

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

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


Часовой пояс GMT +3, время: 14:26.