2015-11-03 151 views
0

我正试图得到下面的代码为Fibonacci移位寄存器工作来产生伪随机数。似乎无法得到它的工作,所以是(有)有什么明显的问题(?)斐波那契移位寄存器伪随机数发生器

Shared Function Main() As Integer 
    Dim start_state As UShort = &HACE1UI ' Any nonzero start state will work. 
    Dim lfsr As UShort = start_state 
    Dim bit As UInteger 
    Dim period As UInteger = 0 

    Do While lfsr <> start_state 
     ' taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 
     bit = ((lfsr >> 0) Xor (lfsr >> 2) Xor (lfsr >> 3) Xor (lfsr >> 5)) And 1 
     lfsr = (lfsr >> 1) Or (bit << 15) 
     period += 1 
    Loop 

    Return 0 
End Function 

末,并“期间”需要由一个大的整数分获得U(0,1)的?

下面是原来的C++代码:

# include <stdint.h> 
int main(void) 
{ 
    uint16_t start_state = 0xACE1u; /* Any nonzero start state will work. */ 
    uint16_t lfsr = start_state; 
    uint16_t bit;     /* Must be 16bit to allow bit<<15 later in the code */ 
    unsigned period = 0; 

    do 
    { 
     /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */ 
     bit = ((lfsr >> 0)^(lfsr >> 2)^(lfsr >> 3)^(lfsr >> 5)) & 1; 
     lfsr = (lfsr >> 1) | (bit << 15); 
     ++period; 
    } while (lfsr != start_state); 

    return 0; 
} 
+0

循环体将不被输入,因为'LFSR = start_state'。尝试浏览代码,看看发生了什么。 – dummy

+0

它从C++代码转换而来,C++代码基本上在“Loop”行上有该语句。 – wrtsvkrfm

回答

2

正如@假人的评论,

Do While lfsr <> start_state 
... 
Loop 

不会在一开始因为lfsr = start_state运行。

等效代码C++

do { 
... 
} while (lfsr != start_state); 

在VB.NET是

Do 
... 
Loop While lfsr <> start_state