最有效的阵列洗牌器

时间:2011-09-05 14:20:39

标签: javascript arrays shuffle performance

如何以最有效的方式对数组的值进行洗牌?

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

4 个答案:

答案 0 :(得分:5)

你有几个选择。

首先,您可以使用愚蠢的天真分拣机......

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

答案 1 :(得分: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/ - 测试结果(可能很慢)

答案 2 :(得分:1)

让我发布自己的答案只是为了鼓励您不要使用随机sort()方法,因为它会产生不太随机输出。

可以这么说,Fisher-Yates shuffle是最efficient的算法,可以通过以下ES6代码轻松实现:

const src = [...'abcdefg'];

const shuffle = arr => arr.reduceRight((res,_,__,arr) => [...res,arr.splice(~~(Math.random()*arr.length),1)[0]],[]);

console.log(shuffle(src));
.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}

答案 3 :(得分: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