2011-09-05 174 views
4

如何以最有效的方式洗牌數組值?最有效的陣列洗牌機

每個元素只是一個包含HTML的字符串。

+1

看一看[here](http:// stackoverflo w.com/questions/962802/is-it-correct-to-use-javascript-array-sort-method-for-shuffling)。 –

+0

http://www.hardcode.nl/subcategory_1/article_317-array-shuffle-function這有一些微不足道的代碼 – doNotCheckMyBlog

+1

http://sedition.com/perl/javascript-fy.html – sanmai

回答

4

您有幾個選擇。

首先,你可以使用stupidely天真分揀機...

arr = arr.sort(function() { 
    return Math.random() - .5 
}); 

jsFiddle

這是快速和骯髒,但往往被認爲是不好的做法。

Further Reading

最好方式隨機排序Array是與Fisher-Yates shuffle

var newArr = []; 

while (arr.length) { 

    var randomIndex = Math.floor(Math.random() * arr.length), 
     element = arr.splice(randomIndex, 1) 

    newArr.push(element[0]);  

} 

JSBin

+0

你爲什麼給我一個「經常被認爲是壞習慣」而不是Fisher-Yates shuffle的jsfiddle鏈接? –

+0

@Adam現在就寫Fisher Yates,不得不查看它:) – alex

+0

沒關係。我將使用http://stackoverflow.com/questions/962802/is-it-correct-to-use-javascript-array-sort-method-for-shuffling/#answer-962890 –

2

這是我使用的一個。它給每個元素一個隨機數,按這些隨機數對數組排序(移動實數值),然後再次去除隨機數。它似乎分佈均勻,但我還沒有數學證明。

arr = arr.map(function(v) { 
    return [v, Math.random()]; 
}).sort(function(a, b) { 
    return a[1] - b[1]; 
}).map(function(v) { 
    return v[0]; 
}); 

http://jsfiddle.net/XQRFt/ - 測試結果(可能會慢)

+0

+1有趣的解決方案。 – alex

+1

這依賴於ECMAScript 5'Array'方法,它排除了IE <9. –

+0

@Tim Down:是的,你是對的。事實上,這些功能在速度方面往往也是低效的。但我個人覺得它更具可讀性。 – pimvdb

0

這是我的解決方案洗牌數組:

function shuffle(array) { 
     var resultArray = new Array(); 
     for(i=0;i<array.length;i++) { 
      var randomEle = Math.floor(Math.random()*array.length); 
      resultArray.push(array[randomEle]); 
      array.splice(randomEle,1); 
     } 
     resultArray = resultArray.concat(array); 
     return resultArray; 
    } 

這是一個洗牌的比賽與其他2

比較我的方法

http://jsperf.com/shuffle-contest/2

+0

我已將@ alex的[@](http://stackoverflow.com/a/7309413/727074)的Fisher-Yates shuffle添加到您的jsPerf ['contest'](http://jsperf.com/shuffle-競賽/ 3)。這是最快的 –