因此,我试图利用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)次迭代,每次迭代时,“改组后的”数组将被推送到我的输出数组。但是,我的最终输出数组最后只有五(5)个相同的“改组”数组,而不是五个不同的数组。由于某种原因,它似乎充满了我循环的LAST迭代中的“改组”数组。
这是我的代码:
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)个元素的数组,每个元素都是从循环的FINAL迭代推入的数组。在循环中,当将shuffledArr变量记录到控制台时,它肯定不同于似乎被推送到我的输出数组的内容。
有任何想法吗?我对此感到非常困惑。我假设是fisher-yates算法中的某些问题导致了此问题。
最佳答案
您每次都在改组相同的数组引用,并用对同一myInput
数组的5个引用填充较大的数组。
对任何一个引用的更改都将影响所有引用,因为它们都指向同一物理阵列
使用slice()
每次迭代复制一个副本,因此每次实际上都有一个新数组
var myInput = [1, 2, 3, 4, 5];
var myOutput = [];
for (i=0; i<5; i++){
var shuffledArr = shuffle(myInput.slice());
myOutput.push(shuffledArr);
}
console.log(myOutput);
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 a = [1,2];
b = a; // not a copy of the [1,2] array ... is reference to it
b[0] = 99;
console.log(a) // [99,2] ...same as `b`
关于javascript - 利用Fisher-Yates随机推送重复阵列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45043349/