gpt4 book ai didi

javascript - for 循环生成的二维 JavaScript 数组正在被最后一个循环结果覆盖

转载 作者:行者123 更新时间:2023-11-30 00:19:52 25 4
gpt4 key购买 nike

我正在尝试制作只在 Linear Feedback Shift Register 行工作的伪随机序列生成器.我用 JavaScript 来做,因为它是我知道的唯一语言,并且我使用 HTML 创建 GUI。用户应输入初始值并获得示意图和伪随机序列本身。这是我的 JavaScript 代码:

var UserInput = document.getElementById('ulaz');
var Output = document.getElementById('izlaz');

//variable `data` is an array of objects which I used to store pictures of circuits
// and [taps][3] necessary for shift registers to give max possible length output
// before going into loop which is 2^n-1, where n (`bit` in my code) is number of
//register blocks and number of digits in input value.

function pss (){
var data = [
{
slika:"pic/2bit.png",
tap:[0,1]
},
{
slika:"pic/3bit.png",
tap:[0,2]
},
{
slika:"pic/4bit.png",
tap:[0,3]
},
{
slika:"pic/5bit.png",
tap:[1,4]
},
{
slika:"pic/6bit.png",
tap:[0,5]
},
{
slika:"pic/7bit.png",
tap:[0,6]
},
{
slika:"pic/8bit.png",
tap:[1,2,3,7]
},
{
slika:"pic/9bit.png",
tap:[3,8]
},
{
slika:"pic/10bit.png",
tap:[2,9]
},
{
slika:"pic/11bit.png",
tap:[1,10]
},
{
slika:"pic/12bit.png",
tap:[0,3,5,11]
},
{
slika:"pic/13bit.png",
tap:[0,2,3,12]
},
{
slika:"pic/14bit.png",
tap:[0,2,4,13]
},
{
slika:"pic/15bit.png",
tap:[0,14]
},
{
slika:"pic/16bit.png",
tap:[1,2,4,15]
},
{
slika:"pic/17bit.png",
tap:[2,16]
},
{
slika:"pic/18bit.png",
tap:[6,17]
},
{
slika:"pic/19bit.png",
tap:[0,1,4,18]
},
{
slika:"pic/20bit.png",
tap:[2,19]
},
{
slika:"pic/21bit.png",
tap:[1,20]
},
{
slika:"pic/22bit.png",
tap:[0,21]
},
{
slika:"pic/23bit.png",
tap:[4,22]
},
{
slika:"pic/24bit.png",
tap:[0,2,3,23]
},
{
slika:"pic/25bit.png",
tap:[2,24]
},
{
slika:"pic/26bit.png",
tap:[0,1,5,25]
},
{
slika:"pic/27bit.png",
tap:[0,1,4,26]
},
{
slika:"pic/28bit.png",
tap:[2,27]
},
{
slika:"pic/29bit.png",
tap:[0,28]
},
{
slika:"pic/30bit.png",
tap:[0,3,5,29]
},
{
slika:"pic/31bit.png",
tap:[2,30]
},
{
slika:"pic/32bit.png",
tap:[1,5,6,31]
}
];
var first = UserInput.value.split("");
for (k=0;k<first.length;k++) first[k] = +first[k];
//first is just UserInput separated in one char strings than parsed to integers
var bit = first.length - 2;
// I subtracted 2 here so I can access objects from data
var matrix = [first];
var t = 0;
var between;
var z;

for (i=1; i<Math.pow(2, bit+2)-1; i++){ //here is that 2^n-1. +2 is because i had -2 before. For loop is starting from 1 and ending with <2^n-1 because i already have first array of matrix
for (j=0; j<data[bit].tap.length; j++){
z = data[bit].tap[j];
t = t ^ matrix[i-1][z];
} // this for makes "t" which is all taps XOR-ed. If user input was 101, tap would be [0,2] and t would be 1xor1=0
between = matrix[i-1];
console.log(between);
between.unshift(t);
between.pop();
matrix[i] = between;
t=0; // here Im "shifting registers" or just placing t in front of last generated row and removing its last digit, thus generating new row
}
console.log(matrix);
}

here是 HTML,因此您可以运行它。

变量data 是我用来存储电路图片和taps 的对象数组。移位寄存器在进入 2^n-1 循环之前提供最大可能长度输出是必要的,其中 n(我的代码中的 bit)是寄存器 block 的数量和输入值中的位数。

所以问题是:console.log(between); 记录最后生成的行都是正确的,除了,ofc,没有最后一行,因为它显示最后生成的,但比 console .log(matrix) 应该记录完整的矩阵,显示所有被最后一行覆盖的行。所以对于用户输入101,矩阵应该是

101
010
001
100
110
111
011

不过是

011
011
011 ...

如果 console.log(between); 之前的部分一切正常,我无法弄清楚它有什么问题......

附言代码未完成,不会在 HTML 中显示解决方案,并且还需要部分函数从矩阵的最后一列组成数组,这是伪随机序列。

最佳答案

我意识到 var between 指的是与 var matrix[i-1] 相同的数组,而不是一个新的独立数组。

between = matrix[i-1];

所以,如果你只想存储矩阵[i-1]的值,而不是创建引用,你可以这样做:

between = JSON.parse(JSON.stringify(matrix[i-1]));

在 js 中,当您在某个变量中复制数组时,默认情况下会创建该数组的引用。有很多方法可以避免这种情况,您可以找到很多示例 here .

关于javascript - for 循环生成的二维 JavaScript 数组正在被最后一个循环结果覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556377/

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