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 5Array
方法,它排除了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;
}