阅读了一些"如何改变"关于SO的问题,我看到this answer被普遍接受:
function shuffle (array) {
var tmp, current, top = array.length;
if(top) while(--top) {
current = Math.floor(Math.random() * (top + 1));
tmp = array[current];
array[current] = array[top];
array[top] = tmp;
}
return array;
}
但是,随机选择列表中的元素like I posted:
会出现什么问题function shuffle (array) {
var result = [];
while(array.length){
var index = Math.floor(Math.random() * array.length);
result.push(array.splice(index, 1)[0]);
}
return result;
}
答案 0 :(得分:2)
你的答案给出的结果似乎没有任何问题,当你拿起一个随机索引然后将其推送到结果数组时,它似乎会对数组进行洗牌。
两种方法之间的区别在于效率,第一种解决方案的最坏情况时间复杂度为O(n),并且您的解决方案的最坏情况时间复杂度为O(n ^ 2),因为拼接具有最差的情况复杂性O(n)和有一个while循环取O(n),第二种方法的空间复杂度为O(n)。
答案 1 :(得分:0)
您可以在.slice()
循环之前调用原始数组上的while
以保留原始数组。
function shuffle (array) {
var result = [];
var temp = array.slice(0);
while(temp.length){
var index = Math.floor(Math.random() * temp.length);
result.push(temp.splice(index, 1)[0]);
}
return result;
}
答案 2 :(得分:0)
明显的问题是,当你的解决方案构造一个新的result
数组时,它也会清空参数array
,这是一种绝对不好的做法。不要不必要地改变你的论点。此外,使用splice
非常低效,因为它在移除后的所有元素周围移动。