【发布时间】:2017-07-11 19:47:37
【问题描述】:
所以我试图利用 Fisher-Yates 算法对数组的元素进行洗牌。然后我想把这个“洗牌”数组推到另一个数组中。我的目标是创建一个包含特定数量的“洗牌”数组的数组。
例如:
var myInput = [1, 2, 3, 4, 5];
我希望我的输出类似于:
myOutput = [[1, 3, 5, 2, 4], [2, 5, 1, 3, 4], [5, 3, 1, 4, 2]];
所以问题发生在我运行我的函数之后。我提供了一个数组,它输出相同的数组,其中的元素按照应有的方式“洗牌”。我在一个循环中运行这个函数,让我们说五 (5) 次迭代,每次迭代,“shuffled”数组被推送到我的输出数组。但是,我的最终输出数组以五 (5) 个相同的“混洗”数组结束,而不是五个不同的数组。出于某种原因,它似乎充满了我循环的最后一次迭代中的“洗牌”数组。
这是我的代码:
function shuffle(array) {
var m = array.length, t, i;
// While there remain elements to shuffle…
while (m) {
// Pick a remaining element…
i = Math.floor(Math.random() * m--);
// And swap it with the current element.
t = array[m];
array[m] = array[i];
array[i] = t;
};
return array;
};
var myInput = [1, 2, 3, 4, 5];
var myOutput = [];
for (i=0; i<5; i++){
var shuffledArr = shuffle(myInput);
console.log(shuffledArr);
myOutput.push(shuffledArr);
}
console.log(myOutput);
就像我说的,myOutput 最终是一个五 (5) 元素数组,每个元素都是从我的循环的最终迭代中推送的数组。在循环中,当 shuffledArr 变量被记录到控制台时,它肯定不同于被推送到我的输出数组的东西。
有什么想法吗?我对此感到非常困惑。我假设 Fisher-yates 算法中的某些东西导致了这个问题。
【问题讨论】:
-
shuffle改变数组,而不是创建一个新数组。你需要复制一份。
标签: javascript