Javascript 使用Fisher-Yates shuffle推送重复阵列?

Javascript 使用Fisher-Yates shuffle推送重复阵列?,javascript,Javascript,所以我尝试使用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]]; 因此,问题发生在我运行函数之后。我提供了一个数组,它输出了相同的数组,其中的元素被“洗牌”。我在一个循环中运

所以我尝试使用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)个相同的“无序”数组结束,而不是五个不同的数组。出于某种原因,它似乎充满了我循环最后一次迭代中的“无序”数组

这是我的密码:

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);
函数洗牌(数组){
var m=数组长度,t,i;
//虽然还有一些元素需要洗牌…
while(m){
//选择剩余的元素…
i=Math.floor(Math.random()*m--);
//并将其与当前元素交换。
t=阵列[m];
数组[m]=数组[i];
数组[i]=t;
};
返回数组;
};
var myInput=[1,2,3,4,5];
var myOutput=[];

对于(i=0;i您每次都在洗牌相同的数组引用,并用对相同
myInput
数组的5个引用填充较大的数组

对任何一个引用的更改都将影响所有引用,因为它们都指向同一个物理数组

使用
slice()
在每次迭代中复制一个副本,这样每次实际上都有一个新数组

var myInput=[1,2,3,4,5];
var myOutput=[];

对于(i=0;iMy-man!我认为这是一种情况,但并没有考虑使用slice()。我尝试在函数中添加一个新数组变量并返回该新数组,但它最终执行了相同的操作。为什么会这样?在我的答案末尾的简化示例中有一定程度的解释……您认为的是“新数组”不是…它仍然是对同一数组的引用。这很有意义。谢谢!
shuffle
对数组进行变异,而不是创建一个新的数组。您需要复制它。