Перестановка массива JavaScript не работает - PullRequest
0 голосов
/ 09 февраля 2012

Я попытался написать некоторый javascript, который принимает записи массива и перемешивает порядокЭто не компилируется так, как должно.Кажется, только один раз проходит через цикл for.Чего мне не хватает?

//random number between 1 and num
function randInt(num){
    return Math.floor(num*Math.random()+1);
}

//shuffles deck (array) of any size
function shuffle(array){
    var newArray = new Array();
    var n = array.length;
    for(i=0; i<n; i++){
        var entry = randInt(array.length) - 1;
        newArray[i] = array[entry]; //assigns random entry in initial array to       new array
            array = array.splice(entry, 1); //removes the entry that was stored into newArray
    }
    array = newArray;
}

Ответы [ 5 ]

4 голосов
/ 09 февраля 2012
  • array.splice изменяет array и возвращает удаленные элементы. Вы хотите отказаться от элемента, поэтому просто сделайте это вместо перезаписи array:
array.splice(entry, 1);
  • + 1 в randInt и выполнение - 1 впоследствии кажется излишним.
  • Используйте var i = 0 (хотя посмотрите на мою последнюю точку).
  • Используйте [] вместо new Array(), так как последний обычно не используется.
  • Возвращать новый массив вместо перезаписи array:
return newArray;
  • Вы изменяете array, поэтому вы не можете больше цикл до n, так как длина становится на 1 каждый раз меньше Вы можете захотеть while(array.length > 0) { ... } вместо цикла for.
3 голосов
/ 09 февраля 2012

Основная проблема, с которой вы здесь столкнулись, заключается в том, что ваш код написан так, как если бы JavaScript был языком вызовов по ссылке.Это не;это вызов по значению.Таким образом, последняя строка функции является синтаксически правильной, но функционально бесполезной.

Вот случайная последовательность Фишера-Йейтса:

function fyShuffle(a) {
  if (a.length < 2) return;
  for (var i = a.length; --i >= 1; ) {
   var j = ~~(Math.random() * (i + 1)), tmp;
   tmp = a[j];
   a[j] = a[i];
   a[i] = tmp;
  }
}
0 голосов
/ 09 февраля 2012
Array.prototype.shuffle= function(){
    var i, L= this.length;
    while(--L){
        i= Math.floor(Math.random()*L);
        this[L]= this.splice(i, 1, this[L])
    }
    return this;
}

Трудно сказать, если сращивание происходит быстрее, чем прямое назначение-

Array.prototype.shuffle= function(){
    var i, temp, L= this.length;
    while(--L){
        i= Math.floor(Math.random()*L);
        temp= this[i];
        this[i]= this[L];
        this[L]= temp;
    }
    return this;
}
0 голосов
/ 09 февраля 2012

Почему бы просто не использовать array.sort с пользовательской функцией?

function shuffle(array) {
    array.sort(function(a, b) {
        return (Math.random() < 0.5) ? 1 : -1;
    });
}
0 голосов
/ 09 февраля 2012

Не нужно заново изобретать колесо (в данном случае это тасование).

function shuffle(o){
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
}

http://snippets.dzone.com/posts/show/849

...