因此,我试图利用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/

10-13 04:09