【问题标题】:2 dimensional JavaScript Array generated by for loop is being overwritten by last loop result由 for 循环生成的二维 JavaScript 数组被最后一个循环结果覆盖
【发布时间】:2015-11-05 22:56:24
【问题描述】:

我正在尝试制作仅在行 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 (@ 987654327@ 在我的代码中)是寄存器块的数量和输入值的位数。

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

101
010
001
100
110
111
011

只是

011
011
011 ...

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

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

【问题讨论】:

  • 为什么这个标签是matlab
  • 我最初是在 15 分钟内在 matlab 中完成的。它也被推荐,但你是对的。这与matlab无关。我会删除标签。

标签: javascript arrays matrix random


【解决方案1】:

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

between = matrix[i-1];

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

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

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

【讨论】:

    【解决方案2】:

    我不知道为什么,但我已经找到了解决方案(有空时会进行更多调查)。

    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();
        // MODIFICATION
        var between_string = between;
        matrix[i] = between_string.join(); // Turn it to a string
        matrix[i] = matrix[i].split(','); // Turn it back to array to keep it working on the for loop above.
       // END MODIFICATION
    
        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 
    }   
    

    现在,当您在控制台中打印出来时,它会显示一个双向数组,虽然这很奇怪,但有时(在我的控制台上)它会显示 int 数字,有时会与字符串数字混合(尊重 between 的原始值) .

    编辑:我尝试只使用“101”作为输入。

    第二次编辑:好吧,我很惭愧,它返回[1,“0”,“0”](示例)的原因是因为 split(',') for "1,0,0"(仅两个数字前面有昏迷)。哈哈。对不起。

    【讨论】:

    • 我不明白你在说什么。您所做的修改是将这些数组的元素从数字转换为字符串,对吗?那应该有什么帮助?我仍然得到错误的输出,现在更接近一点。现在应该是第二个,第三个是第二个,依此类推。最后有 2 个最后的数组。所有字符都是混合的。有些是数字,有些是字符串。
    • 有些是数字,有些是字符串,对于 split() 函数接收逗号“,”作为拆分字符。正如我所说,这是一个有趣的案例,并将就为什么它不适用于 int 数字进行更多研究。我认为更接近您想要的结果会有所帮助,我的意思是,最好是正确地获取具有字符串和 int 数字的数组,而不是重复最后一个值的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多