如何以最有效的方式对数组的值进行洗牌?
每个元素只是一个包含HTML的字符串。
答案 0 :(得分:5)
你有几个选择。
首先,您可以使用愚蠢的天真分拣机......
arr = arr.sort(function() {
return Math.random() - .5
});
这很快而且很脏但通常被认为是不好的做法。
随机排序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]);
}
答案 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
的比赛