2015-11-03 1 views
0

Я пытаюсь получить следующий код, работающий для сдвигового регистра Фибоначчи для генерации псевдослучайных чисел. Может показаться, чтобы не получить его работы, так (есть) есть какие-либо очевидные проблемы (?)Генератор псевдослучайных чисел Фибоначчи

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) «s?

Ниже исходный 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++, который имел этот оператор, по существу, в строке «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