Javascript 最有效的阵列洗牌器

Javascript 最有效的阵列洗牌器,javascript,arrays,shuffle,performance,Javascript,Arrays,Shuffle,Performance,如何以最有效的方式洗牌数组的值 每个元素只是一个包含HTML的字符串。您有几个选择 首先,你可以用一个愚蠢天真的分拣机 arr = arr.sort(function() { return Math.random() - .5 }); 这是一种快速而肮脏的做法,但通常被认为是不好的做法 对数组进行随机排序的最佳方法是使用 .这是我用的。它给每个元素一个随机数,按这些随机数对数组排序(移动实数),然后再次移除随机数。它似乎是均匀分布的,但我还没有从数学上证明它 arr = arr.m

如何以最有效的方式洗牌数组的值


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

您有几个选择

首先,你可以用一个愚蠢天真的分拣机

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

这是一种快速而肮脏的做法,但通常被认为是不好的做法

数组进行随机排序的最佳方法是使用


.

这是我用的。它给每个元素一个随机数,按这些随机数对数组排序(移动实数),然后再次移除随机数。它似乎是均匀分布的,但我还没有从数学上证明它

arr = arr.map(function(v) {
    return [v, Math.random()];
}).sort(function(a, b) {
    return a[1] - b[1];
}).map(function(v) {
    return v[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;
    }
函数洗牌(数组){
var resultArray=新数组();

对于(i=0;i

请允许我发布我自己的答案,以鼓励您不要使用随机
sort()
方法,因为它将产生不太随机的输出

如上所述,是用于该目的的最佳算法,并且可以使用以下ES6代码轻松实现:

const src=[…'abcdefg'],
shuffle=arr=>arr.reduceRight((r,uu,uuu,s)=>
(r.push(s.splice(0 | Math.random()*s.length,1)[0]),r),[])
console.log(JSON.stringify(shuffle(src)))

。作为控制台包装器{min height:100%}
看一看。这有一些小的代码展示。你给了我一个JSFIDLE链接,用于
“经常被认为是不好的做法”
,而不是Fisher-Yates shuffle?@Adam现在正在编写Fisher-Yates,必须查找:)没关系。我将使用OpenDNS:
“网络钓鱼网站阻止网络钓鱼是一种欺诈行为,目的是让你以虚假的借口提供个人信息。"
让我们依赖ECMAScript 5
Array
方法,它排除了IE<9。@蒂姆·唐恩:是的,你说得对。事实上,这些函数在速度上也往往效率低下。但我个人觉得它更可读。我将Fisher-Yates shuffle从@alex添加到了你的jsPerf中。这是fastest@AdamLynch:我补充说,因此,让我为现代、完美平衡(性能-简洁性)解决方案颁奖
    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;
    }