2015-11-05 28 views
2

我試圖製作僞隨機序列生成器,該生成器僅適用於線路Linear Feedback Shift Register。 我在JavaScript中做它,因爲它是我知道的唯一一種使用HTML創建GUI的語言。 用戶應輸入初始值,並獲得原理圖和僞隨機序列本身。 這裏是我的JavaScript代碼:由for循環生成的二維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在我的代碼,得到最大可能長度輸出)是寄存器塊的數量和輸入值中的位數。

所以問題是:console.log(between);它記錄上次生成的行是正確的除外,OFC,也沒有最後一行,因爲它表明最後生成的,但比console.log(matrix)這應該記錄完整矩陣,顯示了最後一個覆蓋所有行。 所以對於用戶輸入101,矩陣應該是

101 
010 
001 
100 
110 
111 
011 

但只是

011 
011 
011 ... 

我無法弄清楚什麼是錯的,如果console.log(between);前部分是所有罰款...

PS代碼沒有完成,它不會在HTML中顯示解決方案,並且仍然需要是從矩陣的最後一列(這是僞隨機序列)製作數組的函數的一部分。

+0

爲什麼被標記爲[tag:matlab]? –

+0

我最初在15分鐘內做了matlab。它也被推薦,但你是對的。它與matlab無關。我刪除標籤。 –

回答

1

我意識到var之間的var指的是與var matrix [i-1]相同的數組,而不是一個新的獨立數組。

between = matrix[i-1]; 

所以,如果你想只存儲矩陣的值[I-1],而不是創建參考,你可以做到這一點是這樣的:

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

在JS當您複製陣列某些變量,您默認創建該數組的引用。有很多方法可以避免這種情況,並且您可以找到許多示例here

0

我不知道爲什麼,但我已經找到了解決方案(當我獲得空閒時間時會進行更多調查)。

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 
} 

現在,當你打印出來的控制檯,它會告訴你一個bidimentional陣列,雖然它的怪異,有時(我的控制檯上),它顯示INT數,有時用繩子號混合(尊重原有值之間)。

編輯:我只使用「101」輸入。

第二次編輯:好吧,我感到羞愧,爲什麼它返回[1,「0」,「0」](舉例)是因爲分裂(',')爲「1,0,0」(只有兩個數字之前有昏迷)。哈哈。抱歉。

+0

我不明白你在說什麼。你所做的修改是將數組中的元素從數字轉換爲字符串,對嗎?這應該如何幫助?我仍然得到錯誤的輸出,現在有點接近。現在應該是第一,第三是第二等等。最後有2個最後的數組。所有字符都是混合的。有些是數字,有些是字符串。 –

+0

有些是數字,有些是字符串做split()函數接收昏迷「,」作爲分割字符。正如我所說,這是一個有趣的案例,並且將會進一步研究爲什麼它不適用於int數。 我認爲對你想要的結果採取更接近的方法會有所幫助,我的意思是,最好使用字符串和整數數組來獲取數組,而不是最後一個值的重複數組。 –