gpt4 book ai didi

javascript - 使用 Fisher-Yates shuffle 推送重复数组?

转载 作者:太空宇宙 更新时间:2023-11-04 15:28:15 27 4
gpt4 key购买 nike

所以我尝试利用 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);

就像我说的,myOutput 最终成为一个五 (5) 个元素数组,每个元素都是从循环的最终迭代中推送的数组。在循环中,当 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 shuffle 推送重复数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com