Как "просканировать" массив
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 цифр, не включая ноль. Вопрос: как сделать так, чтобы цифры в массиве не повторялись, т.е. чтоб каждая цифра была уникальна? |
Цитата:
После 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,
: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> |
рони,
так я и не планировал перетрахивать его постоянно, хотел добавить для случая когда !a.length (если только и впрямь не разово), но когда хост форума начинает долго ковырять, и желание пропадет в правках. :) А вот об итерации массива сразу не подумал, надо запомнить. |
Часовой пояс GMT +3, время: 14:26. |